×

javaudp多线程

javaudp多线程(java udp 聊天程序问题)

admin admin 发表于2023-11-03 22:39:27 浏览37 评论0

抢沙发发表评论

本文目录

java udp 聊天程序问题

import java.io.*;import java.net.*;import java.awt.*;import java.awt.event.*;public class ChatClient extends Frame{ TextArea ta = new TextArea(); TextField tf = new TextField(); public void launchFrame() throws Exception { this.add(ta, BorderLayout.CENTER); this.add(tf, BorderLayout.SOUTH); tf.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { try { String sSend = tf.getText(); if(sSend.trim().length() == 0) return; ChatClient.this.send(sSend); tf.setText(““); ta.append(sSend + “\n“); } catch (Exception e) { e.printStackTrace(); } } } ); this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); setBounds(300,300,300,400); setVisible(true); tf.requestFocus(); } Socket s = null; public ChatClient() throws Exception { s = new Socket(“127.0.0.1“, 8888); launchFrame(); (new Thread(new ReceiveThread())).start(); } public void send(String str) throws Exception { DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(str); } public void disconnect() throws Exception { s.close(); } public static void main(String args) throws Exception { BufferedReader br = new BufferedReader ( new InputStreamReader(System.in)); ChatClient cc = new ChatClient(); String str = br.readLine(); while(str != null && str.length() != 0) { cc.send(str); str = br.readLine(); } cc.disconnect(); } class ReceiveThread implements Runnable { public void run() { if(s == null) return; try { DataInputStream dis = new DataInputStream(s.getInputStream()); String str = dis.readUTF(); while (str != null && str.length() != 0) { //System.out.println(str); ChatClient.this.ta.append(str + “\n“); str = dis.readUTF(); } } catch (Exception e) { e.printStackTrace(); } } }}-----------------------------import java.net.*;import java.util.*;import java.io.*;import java.awt.*;import java.awt.event.*;public class ChatServer extends Frame{ TextArea ta = new TextArea(); public void launchFrame() { add(ta, BorderLayout.CENTER); setBounds(0,0,200,300); this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); setVisible(true); } ServerSocket server = null; Collection cClient = new ArrayList(); public ChatServer(int port) throws Exception { server = new ServerSocket(port); launchFrame(); } public void startServer() throws Exception { while(true) { Socket s = server.accept(); cClient.add( new ClientConn(s) ); ta.append(“NEW-CLIENT “ + s.getInetAddress() + “:“ + s.getPort()); ta.append(“\n“ + “CLIENTS-COUNT: “ + cClient.size() + “\n\n“); } } class ClientConn implements Runnable { Socket s = null; public ClientConn(Socket s) { this.s = s; (new Thread(this)).start(); } public void send(String str) throws IOException { DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(str); } public void dispose() { try { if (s != null) s.close(); cClient.remove(this); ta.append(“A client out! \n“); ta.append(“CLIENT-COUNT: “ + cClient.size() + “\n\n“); } catch (Exception e) { e.printStackTrace(); } } public void run() { try { DataInputStream dis = new DataInputStream(s.getInputStream()); String str = dis.readUTF(); while(str != null && str.length() !=0) { System.out.println(str); for(Iterator it = cClient.iterator(); it.hasNext(); ) { ClientConn cc = (ClientConn)it.next(); if(this != cc) { cc.send(str); } } str = dis.readUTF(); //send(str); } this.dispose(); } catch (Exception e) { System.out.println(“client quit“); this.dispose(); } } } public static void main(String args) throws Exception { ChatServer cs = new ChatServer(8888); cs.startServer(); }}这是一个聊天的程序。看看吧!不是很难的。

java程序怎么实现UDP多线程通信 用split方法分不开两段啊 以下程序有错的地方希望纠错 谢谢!!

a=new byte;a=“没有该用户“.getBytes();首先这句的写法就有大问题了……你把a先指向了一个8192长度的byte数组 然后马上又把a指向xxxx.getBytes(),也就是说第一句没有任何用处然后你具体的代码 我已经不知道你想做什么了~~~如果你只是想用DatagrameSocket来实现数据传输其实很简单的……可以参见orelly的《java网络编程》里面的例子 我就不贴了然后把例子改成多线程的就行了……

用java的netty框架写了一个udp服务端,怎么测试它能承受的并发压力

主从Reactor多线程Nio结构,主从Reactor线程模型的特点是:服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到IO线程池(sub reactor线程池)的某个IO线程上,由它负责SocketChannel的读写和编解码工作。Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的IO线程上,由IO线程负责后续的IO操作。利用主从NIO线程模型,可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。它的工作流程总结如下:从主线程池中随机选择一个Reactor线程作为Acceptor线程,用于绑定监听端口,接收客户端连接;Acceptor线程接收客户端连接请求之后创建新的SocketChannel,将其注册到主线程池的其它Reactor线程上,由其负责接入认证、IP黑白名单过滤、握手等操作;步骤2完成之后,业务层的链路正式建立,将SocketChannel从主线程池的Reactor线程的多路复用器上摘除,重新注册到Sub线程池的线程上,用于处理I/O的读写操作。

关于java UDP方面的一些问题

我把我的代码借鉴给你..不知道能不能够帮助你..!!!自己原创的UDPServer.java:import java.net.*;import java.util.*;public class UDPServer extends Thread { private static final int PORT=10000 ; private static final int DATA_LEN=2046 ; private byte buff =new byte; //以指定字节数组创建准备接受数据的DatagramPacket对象 private DatagramPacket inPacket = new DatagramPacket(inBuff , inBuff.length); //定义一个用于发送的DatagramPacket对象 private DatagramPacket outPacket = null; public void init()throws IOException { try { //创建用于发送、接收数据的MulticastSocket对象 //因为该MulticastSocket对象需要接收,所以有指定端口 socket = new MulticastSocket(BROADCAST_PORT); broadcastAddress = InetAddress.getByName(BROADCAST_IP); //将该socket加入指定的多点广播地址 socket.joinGroup(broadcastAddress); //设置本MulticastSocket发送的数据报被回送到自身 socket.setLoopbackMode(false); //初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 outPacket = new DatagramPacket(new byte , 0 , broadcastAddress , BROADCAST_PORT); //启动以本实例的run()方法作为线程体的线程 new Thread(this).start(); //创建键盘输入流 scan = new Scanner(System.in); //不断读取键盘输入 while(scan.hasNextLine()) { //将键盘输入的一行字符串转换字节数组 byte buff = scan.nextLine().getBytes(); //设置发送用的DatagramPacket里的字节数据 outPacket.setData(buff); //发送数据报 socket.send(outPacket); } } finally { socket.close(); } } public void run() { try { while(true) { //读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。 socket.receive(inPacket); //打印输出从socket中读取的内容 System.out.println(“聊天信息:“ + new String(inBuff , 0 , inPacket.getLength())); } } //捕捉异常 catch (IOException ex) { ex.printStackTrace(); try { if (socket != null) { //让该Socket离开该多点IP广播地址 socket.leaveGroup(broadcastAddress); //关闭该Socket对象 socket.close(); } System.exit(1); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String args) throws IOException { new MulticastSocketTest().init(); }} private DatagramSocket socket ; private DatagramPacket inpacket ; private DatagramPacket outpacket ; public void run() { int i =0; try{ socket=new DatagramSocket(PORT); while(true){ inpacket=new DatagramPacket(buff,buff.length); socket.receive(inpacket) ; System.out.println(new String(buff,0,inpacket.getLength())); byte sedData =new String(“数据信息:“+i).getBytes(); outpacket =new DatagramPacket(sedData,sedData.length,inpacket.getSocketAddress()); socket.send(outpacket); i++ ; } }catch(Exception e){ e.printStackTrace(); } } public static void main(String args){ new UDPServer().start(); } /*public UDPServer (DatagramSocket socket ,DatagramPacket inpacket, DatagramPacket outpacket) { this.socket = socket ; this.inpacket = inpacket ; this.outpacket = outpacket ; }*/};

Java的多线程和网络UDP和TCP怎么理解它们有什么联系

线程是计算机任务执行的最小单位,多线程也就是说一台计算机同时可以干好几件事,例如同时打字和听音乐,而单线程就是打字时只能打字,其他的干不了。udp和tcp是两种协议,网络协议是分层的,他们都是传输层协议。所以协议就是一组约定的规则,没有规矩不成方圆嘛。

Java udp如何通过一个对象完成接收和发送数据

//注意,本地ip以及端口,广播Ip以及端口,可根据自己的电脑实际情况定.我的三段是2//思路:我用的udp启动服务端,进行侦听,如果有消息,就该频段广播一次..//客户端使用多线程,一个发送服务端,一个接受广播..就当我复习了一次...!import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.util.Scanner;public class UdpTest { class SendTest{ private int count=1; private Scanner sc; private byte by,by2;  private InetAddress ip; private SocketAddress sd1,sd2; private DatagramSocket ds,ds2; private DatagramPacket dp,dp2; SendTest(String ipName,int port) throws Exception{ sc=new Scanner(System.in); ip=InetAddress.getByName(ipName); sd1=new InetSocketAddress(ip,port);//发送的目标:ip+端口 sd2=new InetSocketAddress(19823);//己方,省略ip,默认自己本地地址 ds=new DatagramSocket();//参数为自己的标识 //接受 by2=new byte; ds2=new DatagramSocket(sd2); send(); } private void send() throws IOException { new Thread() { public void run() { while(true) { by=sc.nextLine().getBytes(); dp=new DatagramPacket(by,by.length,sd1);//数组,数组长度,目标ip+端口 try { ds.send(dp); } catch (IOException e) { e.printStackTrace(); }//推送服务; System.out.println(“老马第:“+count+++“条信息发送完成!“); } } }.start(); new Thread() { public void run() { while(true) { dp2=new DatagramPacket(by2,by2.length); try { ds2.receive(dp2); System.out.println(“老马接受到一条广播可能来自老宋:“+new String(by2,0,dp2.getLength())); } catch (IOException e) { e.printStackTrace(); } } } }.start(); } } class AccepTest{ private byte by;  private SocketAddress sd1,sd2; private DatagramSocket ds; private DatagramPacket dp; private int count=0; AccepTest() throws Exception{ by=new byte; sd1=new InetSocketAddress(“192.168.2.255“,19823);//广播 sd2=new InetSocketAddress(19822);//己方,省略ip,默认自己本地地址 ds=new DatagramSocket(sd2);//参数为自己的标识,这是用来接受的..... accepts(); } private void accepts() throws IOException { while(true) { count++; System.out.println(“老宋的服务器接受第:“+count+“次数据:...“); dp=new DatagramPacket(by,by.length);//数组,数组长度,仅仅用来接收; ds.receive(dp); //接受服务; String str=new String(by,0,dp.getLength()); System.out.println(“老宋接受到数据---------》“+str); System.out.println(); //广播.. by=(“插个广播:“+str+“....谁发的??“).getBytes(); dp=new DatagramPacket(by,by.length,sd1); ds.send(dp); } } } public static void main(String args) throws Exception { new Thread() { public void run() { try { new UdpTest().new AccepTest(); } catch (Exception e) { e.printStackTrace(); } } }.start(); new Thread() { public void run() { try { new UdpTest().new SendTest(“127.0.0.1“,19822); } catch (Exception e) { e.printStackTrace(); } } }.start(); }}