TCP协议的简单应用一

TCP协议的应用,实现一个服务器处理多个客户端请求(向服务器发送消息,服务器接收到后以原消息返回给客户端。)

客户端类

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

//先写出后读入
public class EchoMultiClient {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);

try {
//创建一个Socket对象,指定要连接的服务器
Socket socket = new Socket("127.0.0.1",6666);

//向服务器发送数据,先从socket获得输出流,并包装
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
System.out.println("请输入要发送的内容:");
String info = input.nextLine();
ps.println(info);
ps.flush();

//读取服务器返回的消息,先从socket获得输入流,并包装
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
info = br.readLine();
System.out.println(info);

//关闭流
br.close();
ps.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

服务器类

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 处理多个客户端
* 主线程用于监听客户端的连接,每次有链接成功,开启一个线程来该客户端的消息
*/
public class EchoMultiServer {
public static void main(String[] args) {

//创建一个固定大小的线程池
ExecutorService es = Executors.newFixedThreadPool(3);

try {
//创建服务器端套接字,并指定端口号
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器已启动,等待连接。。");

//现在不直接处理了,主线程只负责接待,具体操作交由其他线程实现
while (true) {
Socket socket = serverSocket.accept();
System.out.println("一个客户端连接成功。。。" + socket.getInetAddress().getHostAddress());

es.execute(new UserThread(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 用来处理客户端请求的线程任务
*/
class UserThread implements Runnable {

//处理谁?
private Socket socket;

public UserThread(Socket socket) {
this.socket = socket;
}

@Override
public void run() {
try {
//读取客户端请求
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String info = br.readLine();
System.out.println(info);

//向客户端返回消息
PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
ps.println("echo:" + info);
ps.flush();

ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

posted on 2019-05-24 22:46  行之间  阅读(613)  评论(0)    收藏  举报