A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹昌豪 中级黑马   /  2012-6-1 10:15  /  1657 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

习Socket的时候,用自己的电脑写的Socket和ServerSicket可以发送和接收消息吗
一运行就会抛ConnectException,该怎么解决呢

2 个回复

倒序浏览
该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到,或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。

贴一个我收藏的Socket编程简单例子:
注释: Socket-->亦称作"套接字",是java网络编程基础,用来描叙IP地址和端口。
        Socket:建立网络连接时使用.
        ServerSocket:用于服务器端.

   [一个简单的单线程的"Client-Server"例子]
    Server(服务器端):使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生.
    Client(客户端):使用Socket对服务器的端口发出连接请求,一旦连接成功,打开会话.

***********************Server********************
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server{
       public static void main(String []args){
                try{
                       ServerSocket ss = new ServerSocket(8099);
                       System.out.println("服务器已启动,等到客户端的连接...");
                       Socket socket = ss.accept();// -->服务器收到客户端的数据后,创建与此客户端对话的Socket  
                       DataInputStream in=new DataInputStream(socket.getInputStream());
                     // -->用于接收客户端 发来的数据的输入流
                      System.out.println("服务器接受到客户端的连接请求:"+in.readUTF());
                      DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                      out.writeUTF("接受连接请求,连接成功");
                      socket.close();
                      ss.close();
                  }catch(Exception e){
                           e.printStackTrace(); }
              }
        }

*************************Client******************************
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class Client{
             public static void main(String []args){
                    try{
                         Socket socket = new Socket("localhost",8099);
                         DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                         out.writeUTF("客户端请求服务器的连接...");
                         DataInputStream in = new DataInputStream(socket.getInputStream());  
                         System.out.println(in.readUTF()); socket.close();
                    }catch(Exception e){
                           e.printStackTrace();
                 }
         }
     } //注释:8099-->自定义端口,最好大于1024均可
回复 使用道具 举报
是可以的,但是要注意以下几点:
1、Socket(ip,port)   这个ip必须填写本机ip(127.0.0.1) port必须没有被使用(一般前1024留给系统使用)
2、ServerSocket(port)  port必须与Socket的端口一致
3、必须先运行服务器端(Server)再运行客户端(Client),没有服务器,客户端找谁连接呢?
回复 使用道具 举报
操作方法:启动两个命令行窗口或者两个eclipse窗口,先运行服务器类,再运行客户端类。具体代码如下
/*

演示TCP传输
1、TCP分客户端和服务端
2、客户端对应的对象是Socket
        服务端对应的对象是ServerSocket
*/

/*
客户端
通过查阅Socket对象,发现在该对象建立时,就可以连接指定主机
因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输

步骤:
1、创建Socket服务,并指定要连接的主机和端口

*/
import java.io.*;
import java.net.*;
class  TCPClient
{
        public static void main(String[] args) throws Exception
        {
                //创建客户端的Socket服务,指定目的主机和端口
                Socket s=new Socket("",1002);
                //为了发送数据,应该获取socket流中的输出流
                OutputStream out=s.getOutputStream();
                out.write("TCP ge men lai le ".getBytes());
                s.close();
        }
}
/*
需求:定义端点接收数据并打印在控制台上
服务端:
1、建立服务端的Socket服务,ServerSocket();
        并监听一个端口
2、获取连接过来的客服端对象
        通过ServerSocket的accept方法,没有连接就会等,所以这个方法阻塞式的
3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
        并打印在控制台
        4、关闭服务端(可关可不关)
*/
class TCPServer
{
        public static void main(String[] args)throws Exception
        {
                //建立服务端Socket服务,并监听一个端口。
                ServerSocket ss=new ServerSocket(1002);
                //通过accept方法获取连接过来的客户端对象
                Socket s=ss.accept();
                String ip=s.getInetAddress().getHostAddress();
                System.out.println(ip+"....connected");
                //获取客户端发送过来的数据,那么要使用客户端对象的读取来读取数据
                InputStream in=s.getInputStream();

                byte[] buf=new byte[1024];
                int len=in.read(buf);
                System.out.println(new String(buf,0,len));
                s.close();//关闭客户端
                ss.close();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马