1,客户端的socket连接到服务器的套接字

    socket mysocket=new socket("127.0.0.1",30000);用端口号30000连接到本机,当然这里可能发生io异常,注意抛异常

当套接字mysocket建立后,类似一条通信线路已经建立。

    mysocket可以使用getInputStream()方法获得一个输入流,用此输入流来读服务器放入“线路”中的信息(但是不能读自己放入"线路"的信息,就像打电话的听筒)。当然与此对应的mysocket还可以用getOutputStream()方法来获得一个输出流,即拿到了自己的话筒,将自己的要输出的信息放入“线路”

    实际中可能会把mysocket使用getInputStream()获得的输入流的信息放到另一个数据流(如DataInputStream)上,同样把DataOutputStream()流代替getOutputStream()方法

2,ServerSocket类

》客户端建立的socket连接只是负责呼叫服务器,那么服务器也要建立一个等待接受客户的套接字serversocket对象

 ServerSocket server_socket=new ServerSocket(30000);与上面的端口号一致

 

服务器的ServerSocket对象server_socket建立以后,可以使用accept()方法接收客户的套接字呼应

》Socket sc=server_socket.accept();

所谓"接收"客户的套接字连接就是accept()方法会返回一个和客户端Socket对象相连接的Socket对象,服务器端的Socket对象sc使用getoutputstream()方法获得的输出流将指向客户端Socket对象mysocket使用getinoutstream()获得的那个输入流;

同样sc使用getinoutstream获得的输入流将指向mysocket使用getoutputstream获得的输出流

 


上图只是指示出一般的数据流向,实际中的mysocket求情连接和server_socket等待连接,其连接过程是一直相互的

 

>>使用套接字连接时,可能在一断没发出数据之前,另一端就开始尝试读取,这样就会堵塞本线程,直到读到信息为止

同样,accept()方法也会堵塞线程

用完连接后注意close()方法关闭socket

 

4,将套接字放到线程中

因为线程容易堵塞,所以应该为每个套接字连接建立一个线程

例如:客户端使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象要调用

public void connect(SocketAddress xxx) throws IOException

请求和参数SocketAddress 指定地址的套接字建立连接。

为使用该connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,InetSocketAddress的构造方法如下:

public InetSocketAddress(InetSocketAddress add,int port),

下面是简单的实例(不完整):

 

[java] view plain copy
 
  1. Socket socket=new Socket();  
  2. .  
  3. .  
  4. .  
  5. InetAddress addre=InetAddress.getByName("127.0.0.1");  
  6. InetSocketAddress socketAddress=new InetSocketAddress(addre,4331);  
  7. socket.connect(socketAddress);  
  8. ...  
  9. ...  
  10. ..  


当然实际中是自己写一些connect连接方法,可以嵌入自己的需要的一些功能(如添加对话框,登录框、进行验证等)