TCP发送数据
Java中的TCP通信
- Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
- Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
构造方法
方法名 | 说明 |
---|---|
Socket(InetAddress address,int port) | 创建流套接字并将其连接到指定IP指定端口号 |
Socket(String host, int port) | 创建流套接字并将其连接到指定主机上的指定端口号 |
相关方法
方法名 | 说明 |
---|---|
InputStream getInputStream() | 返回此套接字的输入流 |
OutputStream getOutputStream() | 返回此套接字的输出流 |
客户端代码
package _18网络编程.TCP;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ClinetDemo {
public static void main(String[] args) throws Exception {
//开启TCP客户端,设置连接的服务器IP和端口号
Socket socket = new Socket(InetAddress.getByName("192.168.1.53"),9999);
//返回套接字的输出流
OutputStream os = socket.getOutputStream();
Scanner sc = new Scanner(System.in);
String msg = "";
//while设置结束循环的条件
while (!"110".equals(msg = sc.nextLine())){
System.out.println("输入110结束输入");
os.write(msg.getBytes());
}
os.close();
socket.close();
}
}
服务端代码
package _18网络编程.TCP;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("------->服务器开启<--------");
while (true) {
//设置阻塞,只有一个客户端连接时,accept才能返回数据对象
Socket accept = serverSocket.accept();
//获得服务端的IP和端口号
String ip = accept.getInetAddress().getHostAddress();
int port = accept.getPort();
System.out.println("一个客户上线 ip" + ip + ":" + port);
//接收客户端,开启线程
new Thread(()->{
try {
InputStream is = accept.getInputStream();
byte[] arr = new byte[1024];
int len;
while ((len = is.read(arr)) != -1) {
String msg = new String(arr, 0, len);
System.out.println(ip + ":" + msg);
}
is.close();
accept.close();
}catch (Exception e){
}
}).start();
}
}
}
客户端运行效果
服务端运行效果
小结:服务端代码中给每个进来的客户都开启一个线程,即使第一个进来的客户发完消息没有关闭流退出,第二个客户依然可以正常进来发送消息。服务端可以同事接收多个客户发送的消息。