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),
下面是简单的实例(不完整):
Socket socket=new Socket(); . . . InetAddress addre=InetAddress.getByName("127.0.0.1"); InetSocketAddress socketAddress=new InetSocketAddress(addre,4331); socket.connect(socketAddress); ... ... ..