TCP服务器端多发多收

客户端可以多次向服务器端发送消息。服务器端在接收到消息以后,也可以多次向客户端发送消息

服务器端:

package com.tcp;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

/*
TCP协议服务器端
 */
public class revices {
    public static final Logger log = LoggerFactory.getLogger("revices.class");

    public static void main(String[] args) {
        // 服务器端对象
        try {
            ServerSocket ss = new ServerSocket(9090);
            // 客户端和服务器端建立连接
            Socket sc = ss.accept();

            /*
            创建字节输入流用来从TCP通信管道中读取数据
             */
            BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));
            String str;
            // 获取客户端的ip地址
            SocketAddress ip = sc.getRemoteSocketAddress();

            /*
            创建打印流对象,实现服务器向客户端响应数据的功能。
            通过
             */
            PrintWriter pw  = new PrintWriter(new OutputStreamWriter(sc.getOutputStream()));


            // 从键盘录入数据
            BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
            String scanner;
            while ((str = reader.readLine()) != null){
                System.out.println(ip + ": " +str);

                // 从键盘录入字符串并输出该字符串
                scanner = r.readLine();
                pw.println(scanner);
                pw.flush();
            }
        } catch (IOException e) {
//            e.printStackTrace();
        }
    }
}

客户端:

package com.tcp;

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

/*
TCP通信客户端
 */
public class sends {
    public static void main(String[] args) throws Exception {
        // 添加需要连接到的服务器地址
        Socket sc = new Socket("127.0.0.1",9090);
        // 通过打印流发送数据
        PrintWriter writer = new PrintWriter(sc.getOutputStream());
        /*
        如果这里使用的是writer方法,那服务器端接收数据的时候如果选择一行一行的接收,服务器端会接收不到数据
         */
        // 从键盘录入数据
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String str;

        /*
            创建字节输入流用来从TCP通信管道中读取数据
             */
        BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));

        String str1;                            // 用来接收从服务器发送过来的数据
        while (true){
            str = r.readLine();
            writer.println("客服端: " + str);
            writer.flush();
            str1 = reader.readLine();
            System.out.println("服务器: " + str1);
        }

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到,TCP是一对一的两点服务,UDP支持一对一、一对多、多对多的交互通信。因此,TCP本身的特性是一对一的。然而,在实际应用中,一个TCP服务器端可以连接多个TCP客户端,这可能会让人感到疑惑,似乎与TCP的一对一特性相矛盾。 引用中指出,TCP服务端的端口一直都是固定的,比如5679,并没有其他端口显示,因此TCP服务端只有一个端口。 实际上,TCP服务器端实现多对一的方式是通过线程或进程来处理多个连接。当TCP服务器端接收到多个客户端的连接请求时,它会为每个连接创建一个新的线程或进程,以便同时处理多个连接。这样,每个连接都可以独立地进行通信,实现了多对一的交互。 在引用中提到的套接字概念中,每个套接字都包含了通信对象的IP地址、端口号和通信状态等信息。每个套接字相当于一个连接的实例,通过不同的套接字来实现多个连接同时进行。 因此,虽然TCP本身是一对一的,但通过多线程或多进程的方式,TCP服务器端可以实现多对一的连接。每个连接都有独立的套接字,利用不同的端口与不同的客户端进行通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Tcp server是如何一个端口处理多个客户端连接的(一对一还是一对多)](https://blog.csdn.net/weixin_42139800/article/details/125926918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值