Java 多个socket用socket多线程接收数据同时用readutf接收服务端信息只有第一个线程全部完成,第二个就卡在readutf那

用Java Socket制作广播信使程序_Java教程_动态网站制作指南
用Java Socket制作广播信使程序
来源:人气:6804
 简介 是一个强大的面向对象开发语言,支持很多功能,比如,通过Socket编程达到的C/S通讯,基于Windows的编程,基于CONSOLE的编程,还有连接,图象和声音编程等。Java多用在基于INTERNET的网络编程上,创建一些嵌入到Html页面中的Applet小程序来实现。  在开始实际编写代码之前,为了使得概念更加清楚,需要提及几个重要的概念。广播信使(broadcast messenger)是要创建一个服务器,用来负责接收和响应来自客户机的网络消息。这个就叫做广播(Broadcasting),意思是发送数据包或者消息到所有的客户机。  这里使用的是服务器/客户机(C/S)框架,因为有一台计算机扮演服务器的角色来响应客户机的消息,所有其他的计算机都扮演客户机的角色,仅仅只是发送请求到服务器来执行它们的一些任务。Socket是连接计算机彼此的一个逻辑连接。要创建一个socket,需要提供一个端口号和一个主机地址/主机名。  多线程意味着一个进程的多个线程能够同时运行在分配给它们的同一个处理器上,就感觉好象只有进程在运行。所以,通过多线程技术,许多客户机可以连接服务器的同一个端口。线程是占有资源的进程或程序的一部分,比如文件,I/O等等,它们能够独立运行。  Java代码解释  首先,我们创建一个服务器,创建一个server和client类,并import下面几个文件:import java.io.*;import java.net.*;import java.awt.*;  为server类设计一个interface使得从客户机到达的请求能够显示在一个window form里。一个简单server window设计如下:Figure 1: 一个服务器窗口,显示所有输入和输出,客户机名和IP地址的日志。
  我们在窗口顶部创建了一个菜单,在中间创建了一个TextArea和一个Help对话框。我们设置窗口的容器布局治理器为流布局(FlowLayout)。这个流布局治理器以行来放置,当一行满后,自动将组件换到下一行。在JAVA中也有其他的布局治理器可用,比如Border layout manager, Grid layout manager, Card layout manager, Box layout manager, 和GridBag layout manager。下面给出代码:public class ChatServer extends JFrame { public ChatServer(String title) //CONSTRUCTOR TO INITIALIZE THE //ChatServer CLASS {  output = new TextArea (15,40); //output IS A TextArea COMPONENT  //OF THE ChatServer CLASS  output.setEditable (false);  output.setFont(f);  output.setForeground(Color.blue);  setTitle(title); //TO SET THE TITLE OF THE CLIENT WINDOW  setJMenuBar(menuBar); //TO INITIALIZE THE MENU BAR ON THE WINDOW  JMenu fileMenu = new JMenu("File");  JMenu colorMenu = new JMenu("Color");  JMenu helpMenu = new JMenu("Help");  //Main menu Shortcuts:  fileMenu.setMnemonic('F');  colorMenu.setMnemonic('C');  helpMenu.setMnemonic('H');  //About Dialog init:  aboutItem = new JMenuItem("About");  //aboutItem.addActionListener((ActionListener)this);  helpMenu.add(aboutItem);  addMenuItem(helpMenu,aboutAction = new AboutAction("About"));  //Initialize menu items:  menuBar.add(fileMenu);  menuBar.add(colorMenu);  menuBar.add(helpMenu);  enableEvents(AWTEvent.WINDOW_EVENT_MASK);  class AboutAction extends AbstractAction //CREATES AN ABSTRACT
  //INTERNAL CLASS FOR  //About  {   JOptionP   S   public AboutAction(String Name)   {    this.name=N   }   //About menu event:   public void actionPerformed(ActionEvent ae)   {    //if(ae.getSource() == aboutAction)    {     JOptionPane.showMessageDialog(opt,"ChitChat_Broadcast_Messenger\nCopyrightFatima_Ahmed","About_ChitChat_Broadcast_Messenger",JOptionPane.INFORMATION_MESSAGE);    }   }  } Figure 2: ABOUT对话框public static void main (String args[]) throws IOException { ChatServer ServerWindow = new ChatServer("ChitChat BroadcastMessenger: Server Window"); //CREATES AN OBJECT OF SERVER Toolkit theKit = ServerWindow.getToolkit(); //TO CREATE AN OBJECT //OF ToolKit Dimension wndSize = theKit.getScreenSize(); ServerWindow.setBounds(wndSize.width/4,wndSize.height/4,wndSize.width/2,wndSize.height/2); ServerWindow.setVisible(true); ServerWindow.getContentPane().add ("North", output); //TO ADD THE TextArea (output) AT THE NORTH OF THE WINDOW ServerWindow.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER)); //TO SET THE LAYOUT AS CENTRALLY FLOW ServerWindow.pack(); //TO PACK THE SERVER WINDOW WITH ABOVE //INITIALIZE COMPONENTS if (args.length != 1)  throw new IllegalArgumentException ("Syntax: ChatServer&port&");  int port = Integer.parseInt (args[0]);  S  ServerSocket server = new ServerSocket (port);  //TO CREATE AN OBJECT FOR SERVER'S SOCKET  while (true) {   Socket client = server.accept (); //CALLS THE accept()   //METHOD WHENEVER THE   //CLIENTS REQUEST   System.out.intln ("Accepted from " + client.getInetAddress ()+ " with name "+logins);   ChatHandler handler = new ChatHandler (client,yourname);   handler.start (); //THE BROADCASTING OF MESSAGES IS   //STARTED BY start() METHOD   output.append ("\n Accepted from " + client.getInetAddress ()+"\n"); }}  socket是通过另一个类“ChatHandler”创建的,是包含在Demo Project文件中。现在,我们设计一个Client类:Figure 3: Client信使窗口询问每次连接初始化的用户登陆名Figure 4: 一个客户机窗口,包含一些,颜色选取框和一个菜单来控制窗口。
  在Client类中导入以下文件。我们已经创建了另一个类“SketchFrame”,它是用来定义一些客户机窗口的interface的。我们描叙一下JAVA中的Socket类的一些基本功能,并在客户端线程上实现了start ( ), run ( ),和stop ( )方法。这个类有以下导入的文件:import java.io.*;import java.net.*;import java.awt.*;import java.awt.image.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;public class ChatClient implements Runnable, WindowListener,
ActionListener, ListSelectionListener { protected S  public TextA protected TextF S SketchFpublic ChatClient (String host, int port, SketchFrame window) { //CONSTRUCTOR INITIALIZING THE ChatClient CLASS this.host = //host AND port WILL BE USED TO OPEN THE //SOCKET this.port = this.yourname=JOptionPane.showInputDialog("Enter Login name:"); //TO CREATE AN INPUT DIALOG BOX window.setSize(100,100); //TO SET THE SIZE OF THE CLIENT //WINDOW window.getContentPane().add (output,BorderLayout.CENTER); //TO ADD TextArea (output) AT THE CENTER OF THE WINDOW window.getContentPane().add (input,BorderLayout.SOUTH); //TO ADD THE Textbox (input) AT THE BOTTOM (SOUTH) protected DataInputStream dataIn; protected DataOutputStream dataO protected T public synchronized void start () throws IOException { //THREAD SYNCHRONIZATION METHOD FOR STARTING BROADCAST if (listener == null) {  Socket socket = new Socket (host, port); //TO INITIALIZE  //THE SOCKET  try {   dataIn = new DataInputStream(new BufferedInputStream (socket.getInputStream ()));   dataOut = new DataOutputStream(new BufferedOutputStream (socket.getOutputStream ()));   dataOut.writeUTF (yourname+" has loggged on\n ");  }  catch (IOException ex)  {   socket.close ();     } } listener = new Thread (this); listener.start (); window.setVisible (true);}}public synchronized void stop () throws IOException//THREAD SYNCHRONIZATION METHOD FOR STOPPING THE BROADCAST{ if (listener != null) {  listener.interrupt ();  listener =  dataOut.close (); } public void run() { //THREAD METHOD FOR READING A NEW MESSAGE //LINE FROM THE CLIENT try {  while (!Thread.interrupted ())  {   String line = dataIn.readUTF ();   output.append (line + "\n");  } } catch (IOException ex) {  handleIOException (ex); }}  当用户运行程序并在输入框中输入一些信息,然后回车后,start ( )方法就被调用,并创建了一个socket来初始化输入流和输出流,发送在客户端输入的消息给服务器,服务器再广播这个消息到其他客户端。只要对话建立,那么run ( )将被调用,并发送消息。当用户退出程序时,stop ( )方法被调用,并关闭socket连接。
优质网站模板java socket多线程的问题?可以多个线程使用同一个socket吗?_百度知道
java socket多线程的问题?可以多个线程使用同一个socket吗?
客户端连服务器后得到一个返回的socket,然后如果我在客户端开启两个线程,两个线程都用这个socket循环接收服务器发来的消息,我想问当服务器给客户端发消息后,线程1和线程2都能接收到同样一个消息吗?会有先后顺序吗?
我有更好的答案
可以写个demo试一下啊,应该是可以的,socket接收到的消息只能被其中一个线程接收。线程1 和2 接受到的肯定不是同一个消息。会有先后之分。看你怎么控制。比如从接收的消息是ABCD,那么这相当于一个资源。线程1和2在这里拿消息,拿到之后,socket里面就少了,比如线程1拿到AB,线程2拿到CD
采纳率:56%
java多个线程启动时,执行是有先后顺序的
答非所问啊,线程1和线程2都能接收到同样一个消息吗?
理解能力不行么,有执行先后顺序当然不能同时接受
这样的可以动手的问题你干脆直接动手实验就能得知
为您推荐:
其他类似问题
线程的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。JAVA线程池在SOCKET中的应用_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA线程池在SOCKET中的应用
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢博客分类:
Java Socket编程:自己写了一个简单的Java Socket Server/Client应用。调试代码的时候,发现只要重启Server,客户端抛出异常,进程断开。
解决办法:在客户端另外启动一个进程,调用sendUrgentData(0xFF)方法监听是否与服务器端连接成功。
原来的代码:
public void run() {
String message = "";
DataInputStream dis = client.getDis();
while(true) {
String date = new SimpleDateFormat().format(new Date());
message = dis.readUTF();
............
服务器端异常断开, message = dis.readUTF() 会抛出异常信息:java.net.SocketException: Connection reset
Client继承Thread类。
代码如下:
public class TestClient2 extends Thread{
................
public void run() {
while(true)
if(socket == null) {
this.connect();
this.createThread();
boolean connectStatus =
while(connectStatus) {
socket.sendUrgentData(0xFF);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
connectStatus =
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
浏览: 21144 次
来自: 深圳
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'没有更多推荐了,
不良信息举报
举报内容:
JAVA SOCKET 实现多线程文件传输(Server端的多线程,Client一次只有一个)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 socket 多线程接收 的文章

 

随机推荐