Java实现网络套接字编程---TCP实现服务端单线程以及多线程

网络套接字编程之TCP实现聊天–Java

客户端:

package 套接字编程.TCP聊天;

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

/**
 * Create with Darcula IDEA
 * Description:
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //1.创建Socket套接字
        Socket socket = new Socket();
        //2.将此套接字连接到服务器
        InetAddress serverAddress = InetAddress.getLocalHost();
        SocketAddress serverSocketAddress = new InetSocketAddress(serverAddress,8888);
        socket.connect(serverSocketAddress);
        while(true){
            //3.获取用户输入
            System.out.println("请输出:");
            String request = scanner.nextLine();
            //4.通过字节流,直接写入请求
            OutputStream os = socket.getOutputStream();//在这里,此套接是输出
            PrintStream out = new PrintStream(os,true,"UTF-8");
            out.println(request);
            out.flush();// 清空缓冲区的数据流
            //5.通过字节流,直接读取数据
            InputStream is = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
            String response = reader.readLine();
            System.out.println(response);
        }
    }
}

服务端–单线程:

package 套接字编程.TCP聊天;

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

/**
 * Create with Darcula IDEA
 * Description:
 *

 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建ServerSocket套接字
        ServerSocket socket = new ServerSocket(8888);//相当于服务器启动了,并且监听了8080端口
        Scanner scanner = new Scanner(System.in);

        while(true){
            Socket clientSocket = socket.accept();//等待客户端连接8080端口
            InetAddress clientAddress = clientSocket.getInetAddress();
            int  clientPort = clientSocket.getPort();
            System.out.printf("有客户端连接上来 %s:%d%n",clientAddress.getHostAddress(),clientPort);
            //2.获取字节流
            InputStream is = clientSocket.getInputStream();
            //3.字节流转换为字符流
            InputStreamReader isReader = new InputStreamReader(is,"UTF-8");
            //4.字符流转换缓冲字符流
            BufferedReader reader = new BufferedReader(isReader);

            //5.获取输出字节流
            OutputStream os = clientSocket.getOutputStream();
            PrintStream out = new PrintStream(os,true,"UTF-8");

            //6.从缓冲字符流中获取客户端的输出
            String line = reader.readLine();
            System.out.println("对方说:"+ line);
            System.out.println("请回复:");
            String response = scanner.nextLine();
            out.println(response);

            //7.关闭socket
            clientSocket.close();

        }
    }
}

服务端–多线程实现:

package 套接字编程.TCP聊天;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 * Create with Darcula IDEA
 * Description:
 *

 */
public class TCPServerThreads {
    private static class TalkRunnable implements Runnable {
        private Socket clientSocket;
        //构造函数
        TalkRunnable(Socket socket) {
             this.clientSocket = socket;
        }

        @Override
        public void run() {
            try {
                InetAddress clientAddress = clientSocket.getInetAddress();
                int  clientPort = clientSocket.getPort();
                System.out.printf("有客户端连接上来 %s:%d%n",clientAddress.getHostAddress(),clientPort);
                //2.获取字节流
                InputStream is = clientSocket.getInputStream();
                //3.字节流转换为字符流
                InputStreamReader isReader = new InputStreamReader(is,"UTF-8");
                //4.字符流转换缓冲字符流
                BufferedReader reader = new BufferedReader(isReader);

                //5.获取输出字节流
                OutputStream os = clientSocket.getOutputStream();
                PrintStream out = new PrintStream(os,true,"UTF-8");

                while(true) {
                   // 6.从缓冲字符流中获取客户端的输出
                    String line = reader.readLine();
                    System.out.println("对方说:"+ line);
                    String response = "我已经收到了,"+ System.currentTimeMillis();
                    out.println(response);
                    out.flush();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(8888);
        BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>();
        ExecutorService pool = new ThreadPoolExecutor(
                100,
                100,
                0,
                TimeUnit.MILLISECONDS,
                queue
        );
        while(true) {
            Socket clientSocket = socket.accept();
            pool.execute(new TalkRunnable(clientSocket));
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值