说明
java中TCP与UDP不同,UDP的DatagramSocket类既可以接收也可以发送,而TCP传输分为客户端Socket类和服务端ServerSocket类。
不了解UDP的朋友请参考这篇文章
Socket
- Socket类实现客户端套接字。 套接字是两台机器间通信的端点。
- Tcp传输,客户端建立的过程。
(1)创建tcp客户端socket服务。使用的是Socket对象。建议该对象一创建就明确目的地。要连接的主机。
(2)如果连接建立成功,说明数据传输通道已建立。该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入又有输出。想要输入或者输出流对象,可以找Socket来获取。可以通过getOutputStream()和getInputStream()来获取两个字节流。
(3)使用输出流,将数据写出。
(4)关闭资源。
客户端测试程序
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getByName("192.168.0.106"),10000);
OutputStream outputStream = socket.getOutputStream();
//发送数据给服务端,后面加\r\n是给服务端的readLine方法一个结束标记,否则会出现程序阻塞
outputStream.write("测试数据\r\n".getBytes());
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String s = bufferedReader.readLine();
System.out.println(s);
socket.close();
}
- 建立tcp服务端的思路:
(1)创建服务端socket服务。通过ServerSocket对象。
(2)服务端必须对外提供一个端口,否则客户端无法连接。
(3)获取连接过来的客户端对象。
(4)通过客户端对象获取socket流读取客户端发来的数据
并打印在控制台上。
(5)关闭资源。关客户端,关服务端。
服务端测试程序
public static void main(String[] args) throws IOException {
//服务端在监听一个号为10000的端口
ServerSocket serverSocket = new ServerSocket(10000);
//阻塞式方法,用于接收客户端发来的Socket对象
Socket accept = serverSocket.accept();
//服务端本身没有流,流是从客户端获取的(拿着客户端的Socket获取流)
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(accept.getInputStream()));
String s = bufferedReader.readLine();
String ip = accept.getInetAddress().getHostName();
System.out.println("ip:"+ip+s);
//给客户端一个回执信息
OutputStream outputStream = accept.getOutputStream();
outputStream.write("你好客户端,我收到了\r\n".getBytes());
serverSocket.close();
}
构造方法说明
构造方法名称 | 说明 |
---|---|
Socket() | 通过系统默认类型的 SocketImpl 创建未连接套接字,后期可通过connect方法进行指定连接。 |
其他重要提示
一定要留意流中的阻塞式方法,如果使用不当就会导致程序挂起,如缓冲区没有刷新或给对方发送的数据没有结束标记等。因此java提供了两个方法用于告诉对方,本方已经结束的,你可以关闭进行下一步操作了。
方法名称 | 说明 |
---|---|
shutdownInput() | 此套接字的输入流置于“流的末尾”。 |
shutdownOutput() | 禁用此套接字的输出流。 |