java 网络编程中 tcp连接问题。 例如编写聊天室 , c/s结构的c和s端都是不间断实现请求--响应 。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 网络编程中 tcp连接问题。 例如编写聊天室 , c/s结构的c和s端都是不间断实现请求--响应 。相关的知识,希望对你有一定的参考价值。

其中还可以通过多线程来使s端可同时处理多个c端。 现在本人的思想就是如何实现: 当有大于2个客户端连接时 在交互时 必须等到所有客户端发言完毕后 s端将所有客户端的发言集中整合后再对各个客户端进行广播 。 此思想可以用其他解释, 例如编写tcp连接的多人游戏(最简单的石头剪刀布) 服务器端必须等待两人都发送了各自的选择信息完毕以后 再对两人发送的数据进行处理 得到结果后将胜负结果广播给两个客户端界面 。通俗解释就是说在C/S的网络编程中 请求响应都是不断进行的 而这里本人想要达到的效果是客户端请求后服务器接受请求需要等待到一定条件才对客户端进行处理并响应 就像上述的必须所有客户端发言一次才进行广播 或者必须2人都选择石头剪刀布完毕让服务器接受,这完成以后服务器才进行处理再广播结果。 初学java 可能这个思想只用java包中提供的API就能实现 也可能需要自己设计 所以在此求高手解答 不要盲目狂贴代码还不带解释的 重点在于思想 希望有通俗的讲解 或者正好是用到JAVA提供的什么类能够解决 也希望能有讲解 。。。。谢谢高手们看清思想解答 我觉得你们应该能理解这个意思。。。。。。如果表达不清晰请谅解。。
补充的就是 遇到的问题: 比如我想实现上述的聊天室 等所有客户端发言一次 再简单点 当接受到2条发送的发言数据以后 就广播 那么我想通过一个string数组实现 当数组都不为null时就进行响应操作(即广播) 但是会发现由于多线程的存在 每个线程拥有自己的string数组 也就是无论怎么操作 客户端发送的请求都服务器开启的各个线程分别处理了 但是我希望客户端发送的请求能够被各个线程处理以后 送往一个地方集中 进行处理 再重新分配给各个线程并响应给各个客户端 可能这个想法好像是错误的 各个线程若能够将数据集中在一个地方 那么处理以后再重新分配好像是不可能的 好像说是线程只能启动一次。。。。。反正这其中的道理理解的不是很深刻 求指点 也查了许多资料 但是都只能解决正常聊天室的编写 请求一次就响应一次 即时广播。 搜索像java联机游戏编写 许多代码又看不懂 所以万般无奈只能求助高人。。 求指导思想。

如果将各线程接受的各客户端发送的请求数据都保存在同一个文件中 然后等达到条件 让服务器读取文件处理后响应给各个客户端 。 这个方法是否可行。。。?

参考技术A 你的意思我差不多明白了,现在我跟你说下那个两个人猜拳的一个思路
服务端是可以查看客户端连接情况的
你可以在客户端弄一个Map 用服务端的IP 作为键 , 发送的消息作为值存放
客户端发送消息后就存放在Map里面
当服务端接收到两边客户端都有传入消息,就根据IP 取出值来比较
然后将结果返回给客户端

其实那个多人聊天,需要所有人发言后才会公布广播的,也可以按照这个思路去做追问

我先去查下map是什么 按你说的摸索一下 你别回答我。。。我自己搜索对我启发大。。。等我实在不行了我再请教你
要不然你留个qq呗。。。。=。=

追答

猜拳的那个做的好的话,你可以在服务端开个十秒的定时任务,当猜拳开始的时候发消息给客户端 十秒内请输入你要出的拳,当10秒过后会去map里面根据客户端IP 拿用户输入的值对比
如果某一方未输入,视为弃权,这样就避免了一方不输入,服务端就一直不会公布结果

参考技术B c/s

就是一个不断请求响应的过程。
如果你是想做一个聊天室的话,想得到广播的内容,你就需要向服务器端发送请求,然后得到响应。也就是C端定时向S端发送请求。追问

-,- 我会做聊天室 也会定时发送请求。。。。我的问题应该讲清楚了

主要就是要达到条件再响应。 不是定时发送请求。。。是达到条件。。。

追答

我不知道我理解的对不对,比哪说有五个人在聊天室里。也就是有五个客户端。
你难道要等五个人都发一次言,才可以看到吗?这样显然是不可取的。如果有一个人不发言,
那剩下的四个人不是要无限等待了?

我的想法是,做一个队列,用来记录,发来的消息。
再创建出N个除列,分别对应在线的N个用户。
一个消息发过来,复制成N份,存到N个队列中。
那个用户有请求过来,就据相应队列中的消息反回给该用户。

这个被设成推荐的了,可能再回复不了了,可能通过百度hi联系。

本回答被提问者和网友采纳
参考技术C 每个客户端请求都给他分配不同得 端口号
并且用一个主端口号来监听请求。按这种思路就行了!追问

能说的详细点吗? 意思是 主端口监听请求,让所有客户端的请求都由此主端口监听

然后每个客户端自己也又被服务器分配了各自的端口 这样就是每个客户端的请求被两个端口在监听(一个主端口 一个被分配的端口) 是这个意思吗?

参考技术D 哦 你是不是想写一个天黑请闭眼啊追问

问题差不多解决了。。你说的这个倒是高级了点 不过思想也是这样。

追答

呵呵 我说看着像么

java 网络编程-TCP-多人群聊(自问自答)

在线聊天室
服务器:

public class Chat 

public static void main(String[]args) throws IOException

    System.out.println("服务器启动中...");
    //创建服务器
    ServerSocket server=new ServerSocket(9999);
    //阻塞式等待连接,当客户端Socket创建好以后才开启

    while(true)
    
    Socket client=server.accept();
    System.out.println("一个客户端建立了连接");

    new Thread(()->
        DataInputStream dis = null;
        DataOutputStream dos = null;
        try 
            dis = new DataInputStream(client.getInputStream());
            dos = new DataOutputStream(client.getOutputStream());
         catch (IOException e1) 
            e1.printStackTrace();
        

        boolean flag=true;
        while(flag) 

        String msg = null;
        try 
            msg = dis.readUTF();
            dos.writeUTF(msg);
            dos.flush();
         catch (IOException e) 

            //当断掉客户端连接时,不用循环再读取数据
            flag=false;
        

        //返回消息

        
        try 
            if(null!=dos)
            
            dos.close();
            
         catch (IOException e) 

            e.printStackTrace();
        
        try 
            if(null!=dis)
            
            dis.close();
            
         catch (IOException e) 

            e.printStackTrace();
        
        try 
            if(null!=client)
            
            client.close();
            
         catch (IOException e) 

            e.printStackTrace();
        
    ).start();

    
    

客户端:

public class Client

public static void main(String[]args) throws UnknownHostException, IOException

    System.out.println("客户端启动中...");

    Socket client=new Socket("localhost",9999);
    //客户端发送消息
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    DataOutputStream dos=new DataOutputStream(client.getOutputStream());
    DataInputStream dis =new DataInputStream(client.getInputStream());
    boolean flag=true;

    while(flag) 
    System.out.println("请输入消息");
    String msg=br.readLine();
    dos.writeUTF(msg);
    dos.flush();
    //获取消息

     msg=dis.readUTF();
     System.out.println(msg);
    

     dos.close();
     dis.close();
     client.close();


以上是关于java 网络编程中 tcp连接问题。 例如编写聊天室 , c/s结构的c和s端都是不间断实现请求--响应 。的主要内容,如果未能解决你的问题,请参考以下文章

java 网络编程-TCP-多人群聊究极版

Java网络编程 - TCP通信

Java编程实例-tcp聊天室代码实现

聊聊缓存

Java网络编程

Java基础知识—网络Socket