java socket 多线程 tcp,廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

TCP多线程编程 一个ServerSocket能够和多个客户端同时创建链接,因此一个Server能够同时与多个客户端创建好的Socket进行双向通讯。 所以服务器端,当咱们打开一个Socket之后,一般使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket链接,紧接着启动一个新的线程,来处理这个链接。java

ServerSocket ss = new ServerSocket(port);

for( ; ; ){

Socket sock = ss.accept();

Thread t = new Thread(){

public void run(){

process(sock);

}

}

t.start();

}

TCPServer.java编程

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.nio.charset.StandardCharsets;

import java.time.LocalDateTime;

public class TCPServer {

public static void main(String[] args) throws Exception{

ServerSocket ss = new ServerSocket(9090);

System.out.println("TCP Server ready");

for(;;){

Socket sock = ss.accept();

System.out.println("Accept from "+sock.getRemoteSocketAddress());

TimeHandle handle = new TimeHandle(sock);

handle.start();

}

}

}

class TimeHandle extends Thread{

Socket sock;

TimeHandle(Socket sock){

this.sock = sock;

}

public void run(){

try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))){

try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){

for(;;){

String cmd = reader.readLine();

if("q".equals(cmd)){

writer.write("bye!\n");

writer.flush();

break;

}else if("time".equals(cmd)){

writer.write(LocalDateTime.now().toString()+"\n");

writer.flush();

}else{

writer.write("Sorry?\n");

writer.flush();

}

}

}

}catch (IOException e){

e.printStackTrace();

}finally {

try{

this.sock.close();

}catch (IOException e){

e.printStackTrace();

}

}

}

}

运行2次client,服务器端的运行结果 762f21d902b76b1aa3bd9fa7be4487d6.png TCPClient.java服务器

import java.io.*;

import java.net.InetAddress;

import java.net.Socket;

import java.nio.charset.StandardCharsets;

public class TCPClient {

public static void main(String[] args) throws Exception{

InetAddress addr = InetAddress.getByName("localhost");

System.out.println(addr);

try(Socket sock = new Socket(addr,9090)){

try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))){

try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){

writer.write("time\n");

writer.flush();

String resp = reader.readLine();

System.out.println("Response:"+resp);

Thread.sleep(1000);

writer.write("q\n");

writer.flush();

resp=reader.readLine();

System.out.println("Response:"+resp);

}

}

}

}

}

02011929e4ce398985c6e36dbf9bc6ad.png多线程

总结:

TCP多线程编程模型:this

服务器端使用无限循环

每次accept返回后,建立新的线程来处理客户端请求

每一个客户端请求对应一个服务线程

使用线程池能够提升运行效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值