首页 > 其他分享 >11 多线程实现聊天

11 多线程实现聊天

时间:2023-09-09 21:55:08浏览次数:24  
标签:11 java myPort 聊天 import Test11 new 多线程 public


气死了,这个错误搞了半天!

package Internet;

import java.net.DatagramSocket;
import java.net.SocketException;

public class Test11_Me {
    public static void main(String[] args) throws Exception {
        new Thread(new Test11_Send(205,"localhost",2000)).start();
        new Thread(new Test11_Receive(2005,"哥哥")).start();
        // 错了半天,才发现:这两个myPort 不能相同,2001 != 2005 ,气死了,调了半天
           //  Address already in use: bind 看出错的解释啊,混蛋
    }
}


////////////////////////////////
package Internet;

import java.net.DatagramSocket;
import java.net.SocketException;

public class Test11_MyBrother {
    public static void main(String[] args) throws Exception {
        new Thread(new Test11_Send(200,"localhost",2005)).start();
        new Thread(new Test11_Receive(2000,"弟弟")).start();
    }
}
//////////////////////////
package Internet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class Test11_Send implements Runnable {
    int myPort,toPort;
    String toIP;
    DatagramSocket socket=null;
    BufferedReader reader =null;


    public Test11_Send(int myPort,String toIP ,int toPort){
        this.myPort = myPort;
        this.toPort = toPort;
        this.toIP = toIP;
        try {
            socket=new DatagramSocket(myPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            // 2. 不断地建立包裹并发送出去: 可以不停地发消息
            // 从控制台键盘读取信息,并且发送出去
            while (true) {
                String msg = reader.readLine();
                //  byte[] data=(byte[])reader;  这里不能强制转换
                DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.length(), new InetSocketAddress(toIP, toPort));
                socket.send(packet);
                if (msg.equals("bye")) {
                    break;
                } // 结束判定
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 3. 关闭
        socket.close();
    }
}
///////////////
package Internet;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Test11_Receive implements Runnable{
    int myPort,toPort;
    DatagramSocket socket=null;
    String str;

    public Test11_Receive( int myPort,String str){
        this.myPort = myPort;
        this.str=str;
        // 1. 创建自己的端口
        try {
            socket = new DatagramSocket(myPort);
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public void run() {
        try {

            // 2. 不停地接收包裹:可以不停地接收信息
            while (true){
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
                socket.receive(packet); // 阻塞式接收:有就接收
                String msg=new String(packet.getData(),0,packet.getLength());
                System.out.println(str+":"+msg);
                if (msg.equals("bye")){
                    break;
                }

            }
        }catch (Exception e){
            e.printStackTrace();
        }

        // 3. 关闭
        socket.close(); // 阻塞式接收:不断地接收
    }
}

标签:11,java,myPort,聊天,import,Test11,new,多线程,public
From: https://www.cnblogs.com/zhanjianhai/p/17690232.html

相关文章

  • JavaSE--多线程
    一、多线程1、进程与线程概念  进程是一个应用程序(1个进程是一个软件),一个进程可以启动多个线程  线程是一个进程中的执行场景/执行单元2、进程与线程的关系  a)进程与线程    进程可以看作是一个公司,线程就是公司中的一个小员工    进程A与进程B的内存独立不......
  • rust 多线程
    多线程之间的通信和内存共享常见方式usestd::sync::mpsc;usestd::thread;usestd::sync::{Arc,Mutex};structUser{name:String}fnmain(){//Arc通过共享内存在线程间通信数据不可修改(所以这里使用的不可变引用)letusr_raw=Arc::new(User{......
  • 10 UDP 聊天实现
    packageInternet;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetSocketAddress;//UDP实现聊天,两边都是发信方,也是收信方publicclassTest10_UDP_Me{pub......
  • [HDU4117] GRE
    RecentlyGeorgeispreparingfortheGraduateRecordExaminations(GREforshort).Obviouslythemostimportantthingisrecitingthewords.NowGeorgeisworkingonawordlistcontaining\(N\)words.Hehassopooramemorythatitistoohardforhim......
  • 2.11 PE结构:添加新的节区
    在可执行PE文件中,节(section)是文件的组成部分之一,用于存储特定类型的数据。每个节都具有特定的作用和属性,通常来说一个正常的程序在被编译器创建后会生成一些固定的节,通过将数据组织在不同的节中,可执行文件可以更好地管理和区分不同类型的数据,并为运行时提供必要的信息和功能。节的......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第一周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第一周学习笔记一、任务要求任务详情自学教材第1,2章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)......
  • 2.11 PE结构:添加新的节区
    在可执行PE文件中,节(section)是文件的组成部分之一,用于存储特定类型的数据。每个节都具有特定的作用和属性,通常来说一个正常的程序在被编译器创建后会生成一些固定的节,通过将数据组织在不同的节中,可执行文件可以更好地管理和区分不同类型的数据,并为运行时提供必要的信息和功能。节的......
  • 洛谷P8211 [THUPC2022 初赛] 搬砖
    题目链接以下设\(B\)为一个阈值,同时也表示值域分块的块长。先考虑所有\(b\)都不为\(0\)的情况。对于一组询问,我们设一个\(x\)表示:当前已搬完所有\(a\leqx\)的砖。那么每次只可能是以下两种情况之一:有至少一摞砖在当前这个单位时间内被搬完拿\(x\)加上\(d\),之......
  • CF1106F
    题目链接description定义数列\(f\),当\(i>k\)时,\(f_i=\prod\limits_{j=1}^kf_{i-j}^{b_k}\)模998244353。已知数组\(b\)且\(f_1,f_2,\dots,f_{k-1}\)均等于1,给定\(n,m\)。求任意一个合法的\(f_k\)的取值(在\([0,998244352]\)间),使得\(f_n=m\)无解输出-1\(k......
  • POJ2411 Mondriaan's Dream(多米诺密铺问题)
    不妨设\(n,m\)相等,常规的状压DP做法时间复杂度为\(O(n*2^n)\),但是可以通过套用公式使复杂度变为\(O(n^2)\)。具体地,用\(1*2\)的小长方形覆盖\(n*m\)的棋盘的方案数为\[\Large\prod\limits_{j=1}^{\left\lceil\frac{m}{2}\right\rceil}\prod\limits_{k=1}^{\l......