TCP通信案例_Socket
客户端向服务器发送数据
注意事项:
- 要先启动服务端 , 如果先启动客户端 , 找不到对应的服务端的话会马上报错.
- 如果服务端是启动状态 , 不能再次启动 , 否则会发生端口号冲突
- 接收数据不能用while循环 , 第一个在会话过程中没必要,第二个会发生数据错误的问题,导致程序异常
客户端:
package com.liqiliang.demo04_TCP循环聊天;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/*
TCP客户端的实现
*/
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
//1.创建客户端Socket对象,指定服务器端的IP和端口
Socket socket = new Socket("127.0.0.1", 9999);
//2.获取网络输出流,进行发送数据
OutputStream netOut = socket.getOutputStream();
//3.获取网络的输入流,进行接收数据
InputStream netIn = socket.getInputStream();
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("To Server:");
String msg = sc.next();
if("exit".equals(msg)){
socket.shutdownOutput();//通知服务端,客户端的消息已经发送结束,没有必要再等待数据的发送
System.exit(0);
}
//发送数据
netOut.write(msg.getBytes());
byte[] bytes = new byte[1024]; //一次接收1024个字节
int len = netIn.read(bytes);//读取了多少个有效的字节个数
System.out.println("Server:"+new String(bytes, 0, len));//将有效的字节信息转换为字符串
Thread.sleep(1000);
}
//4.结束关闭释放资源
// socket.close();
}
}
服务端:
package com.liqiliang.demo04_TCP循环聊天;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器代码实现
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
//1.创建服务端ServerSocket对象,绑定端口
ServerSocket serverSocket = new ServerSocket(9999);
//2.服务端对象调用accept方法,返回一个新的Socket对象(服务),
System.out.println("服务端开启,等待客户端连接...");
Socket socket = serverSocket.accept();//也会发生阻塞,等待客户端的连接
System.out.println("有客户端进来...IP:" + socket.getInetAddress());
//3.获取Socket的输入流,读取客户端发送的数据 getInputStream()
InputStream netIn = socket.getInputStream();
//4.获取Socket的输出流,写出数据给客户端 getOutputStream
OutputStream netOut = socket.getOutputStream();
Scanner sc = new Scanner(System.in);
while (true) {
byte[] bytes = new byte[1024];
int len = netIn.read(bytes);
System.out.println("Client:"+new String(bytes, 0, len));
System.out.println("To Client:");
String str = sc.next();
netOut.write(str.getBytes());
Thread.sleep(1000);
}
//5.关闭释放资源
// socket.close();
// serverSocket.close();//理论上服务端是不能关闭的
}
}
唯有努力,人生没有白走的路,每一步都算数

浙公网安备 33010602011771号