Socket监听的多线程怎么实现? 用Socket监听有没有其他Socket请求连接,如果不用多线程,一开始监听就堵塞,整个UI就死了,只有用多线程才能实现在监听的同时还可以操作UI吧?具体应该怎么实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/mhapdream/article/details/8929253 Socket:java与C之间的文件传送<1>(C语言之间的通信)http://blog.csdn.net/mhapdream/article/details/8929457 Socket:java与C之间的文件传送<2>(JAVA语言之间的通信)http://blog.csdn.net/mhapdream/article/details/8929590 Socket:java与C之间的文件传送<3>(JAVA与C通信需要注意的地方)http://blog.csdn.net/mhapdream/article/details/8929638 Socket:java与C之间的文件传送<4>(JAVA与C通信) 各自用独立的类实现,彼此之间公布接口进行调用。socket部分用多线程控制。import javax.swing.*;import java.awt.event.*;import java.awt.*;import java.net.*;import java.io.*;import java.util.*;class ClientSocketListener extends Thread{ private Socket socket; private BufferedReader br; ServerFrame serverFrame; ClientSocketListener(Socket socket,ServerFrame serverFrame) throws Exception { this.socket = socket; br = new BufferedReader(new InputStreamReader(socket.getInputStream())); this.serverFrame = serverFrame; } public void run() { String s = null; try { while ( (s = br.readLine())!=null) { //向其他客户端发送 //ServerSocketThread.SendMsg(s); //显示在Server的界面上 serverFrame.printServerMsg(s+"\r\n"); } } catch (Exception e) { e.printStackTrace(); } }}class ServerSocketThread implements Runnable{ ServerSocket serverSocket; ServerFrame serverFrame; static private ArrayList<PrintStream> sClientList = new ArrayList<PrintStream>(); static private ServerSocketThread serverSocketThread; static public ServerSocketThread makeServerSocketThread(ServerFrame serverFrame) { if (serverSocketThread == null) { serverSocketThread = new ServerSocketThread(serverFrame); } return serverSocketThread; } //使用单例模式 private ServerSocketThread(ServerFrame serverFrame) { try { serverSocket = new ServerSocket(20000); this.serverFrame = serverFrame; } catch (Exception e) { e.printStackTrace(); } } //服务器逻辑线程接口 static public void SendMsg(String s) { for (PrintStream os: sClientList) { try { os.println(s); } catch (Exception e) { e.printStackTrace(); } } } public void run() { while (true) { try { Socket s = serverSocket.accept(); OutputStream os = s.getOutputStream(); PrintStream ps = new PrintStream(os); ps.println("你好!你已经成功连接到服务器!"); if (serverFrame != null) { serverFrame.printServerMsg("有一个客户端连接到服务器了!"+s+"\r\n"); } sClientList.add(ps); new ClientSocketListener(s,serverFrame).start(); //os.close(); //s.close(); } catch (Exception e) { e.printStackTrace(); } } }}//服务器UI部分class ServerFrame extends JFrame{ JButton btnMsg = new JButton("发送消息"); JTextArea txt = new JTextArea(30,30); JTextField field = new JTextField(20); ServerFrame() { setTitle("服务器"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); btnMsg.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //JOptionPane.showMessageDialog(null,"显示消息"); ServerSocketThread.SendMsg(field.getText()); } }); txt.setText("来自客户端的消息"); JPanel panel = new JPanel(); panel.add(field); panel.add(btnMsg); add(panel,BorderLayout.NORTH); add(new JScrollPane(txt),BorderLayout.CENTER); pack(); } //对外抛出打印接口 public void printServerMsg(String s) { txt.append(s); }}class ClientSocketThread extends Thread{ private Socket socket = null; private ClientFrame clientFrame = null; BufferedReader br = null; PrintStream ps = null; { try { socket = new Socket("127.0.0.1",20000); InputStream is = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); ps = new PrintStream(socket.getOutputStream()); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,"连接服务器失败了!"); } } public void run() { while (true) { try { String buf = null; while ((buf = br.readLine())!=null) { clientFrame.txt.append(buf+"\r\n"); } } catch (Exception e) { e.printStackTrace(); } } } ClientSocketThread(ClientFrame clientFrame) { this.clientFrame = clientFrame; } //关闭时调用销毁函数 public void destory() throws Exception { br.close(); socket.close(); } public void sendMsg(String s) { ps.println(s); }}class ClientFrame extends JFrame{ JButton btnSend ; JTextArea txt; JTextField field; ClientSocketThread csocketThread = null; ClientFrame() { setResizable(false); setTitle("客户端"); setBounds(100,100,500,600); btnSend = new JButton("发送"); btnSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { if (csocketThread != null) { csocketThread.sendMsg(field.getText()); } } catch (Exception ex) { ex.printStackTrace(); } } }); JPanel panel = new JPanel(); field = new JTextField(30); panel.add(field); panel.add(btnSend); add(panel,BorderLayout.SOUTH); txt = new JTextArea(20,20); add(new JScrollPane(txt),BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); pack(); } public void printMsg(String s) { txt.append(s); } public void setSoeckt(ClientSocketThread csocketThread) { this.csocketThread = csocketThread; }}public class SoketFrame { public static void main(String[] args) { ServerFrame serverFrame = new ServerFrame(); ServerSocketThread sthread = ServerSocketThread.makeServerSocketThread(serverFrame); new Thread(sthread).start(); ClientFrame clientFrame = new ClientFrame(); ClientSocketThread cthread = new ClientSocketThread(clientFrame); clientFrame.setSoeckt(cthread); cthread.start(); System.out.println("Hello World!"); }} 一个关于Scanner类中next()和nextLine()方法的问题 求教 二叉树! 哪个开源的报表工具可以更方便的实现如下所示图片啊? 怎么用穷举来做 一个关于兔子的古典问题 用composite模式写的一个二叉树 是否有工具可以提取用到的类 如何让一个checkbox被选中后,后面出现一个文本框?? 用JMF播放互联网上的文件,该怎么实现? 我的程序为何不通? 怎么在jbuilder中添加断点调试程序呀? 高手来算算 写文件咋写不进去
http://blog.csdn.net/mhapdream/article/details/8929457 Socket:java与C之间的文件传送<2>(JAVA语言之间的通信)
http://blog.csdn.net/mhapdream/article/details/8929590 Socket:java与C之间的文件传送<3>(JAVA与C通信需要注意的地方)
http://blog.csdn.net/mhapdream/article/details/8929638 Socket:java与C之间的文件传送<4>(JAVA与C通信)
socket部分用多线程控制。import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
class ClientSocketListener extends Thread
{
private Socket socket;
private BufferedReader br;
ServerFrame serverFrame;
ClientSocketListener(Socket socket,ServerFrame serverFrame)
throws Exception
{
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.serverFrame = serverFrame;
} public void run()
{
String s = null;
try
{
while ( (s = br.readLine())!=null)
{
//向其他客户端发送
//ServerSocketThread.SendMsg(s);
//显示在Server的界面上
serverFrame.printServerMsg(s+"\r\n");
}
}
catch (Exception e)
{
e.printStackTrace();
} }}class ServerSocketThread implements Runnable
{
ServerSocket serverSocket;
ServerFrame serverFrame; static private ArrayList<PrintStream> sClientList = new ArrayList<PrintStream>();
static private ServerSocketThread serverSocketThread;
static public ServerSocketThread makeServerSocketThread(ServerFrame serverFrame)
{
if (serverSocketThread == null)
{
serverSocketThread = new ServerSocketThread(serverFrame);
} return serverSocketThread;
} //使用单例模式
private ServerSocketThread(ServerFrame serverFrame)
{
try
{
serverSocket = new ServerSocket(20000);
this.serverFrame = serverFrame;
}
catch (Exception e)
{
e.printStackTrace();
} }
//服务器逻辑线程接口
static public void SendMsg(String s)
{
for (PrintStream os: sClientList)
{
try
{
os.println(s);
}
catch (Exception e)
{
e.printStackTrace();
}
}
} public void run()
{
while (true)
{
try
{
Socket s = serverSocket.accept();
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("你好!你已经成功连接到服务器!");
if (serverFrame != null)
{
serverFrame.printServerMsg("有一个客户端连接到服务器了!"+s+"\r\n");
}
sClientList.add(ps);
new ClientSocketListener(s,serverFrame).start(); //os.close();
//s.close();
}
catch (Exception e)
{
e.printStackTrace();
} }
}
}
//服务器UI部分
class ServerFrame extends JFrame
{
JButton btnMsg = new JButton("发送消息");
JTextArea txt = new JTextArea(30,30);
JTextField field = new JTextField(20);
ServerFrame()
{
setTitle("服务器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
btnMsg.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//JOptionPane.showMessageDialog(null,"显示消息");
ServerSocketThread.SendMsg(field.getText());
}
});
txt.setText("来自客户端的消息");
JPanel panel = new JPanel();
panel.add(field);
panel.add(btnMsg);
add(panel,BorderLayout.NORTH);
add(new JScrollPane(txt),BorderLayout.CENTER);
pack();
} //对外抛出打印接口
public void printServerMsg(String s)
{
txt.append(s);
}
}
class ClientSocketThread extends Thread
{
private Socket socket = null;
private ClientFrame clientFrame = null;
BufferedReader br = null;
PrintStream ps = null; {
try
{
socket = new Socket("127.0.0.1",20000);
InputStream is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
ps = new PrintStream(socket.getOutputStream());
}
catch (Exception e)
{
e.printStackTrace();
JOptionPane.showMessageDialog(null,"连接服务器失败了!");
}
}
public void run()
{
while (true)
{
try
{
String buf = null;
while ((buf = br.readLine())!=null)
{
clientFrame.txt.append(buf+"\r\n");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
} ClientSocketThread(ClientFrame clientFrame)
{
this.clientFrame = clientFrame;
}
//关闭时调用销毁函数
public void destory() throws Exception
{
br.close();
socket.close();
} public void sendMsg(String s)
{
ps.println(s);
}
}class ClientFrame extends JFrame
{
JButton btnSend ;
JTextArea txt;
JTextField field;
ClientSocketThread csocketThread = null;
ClientFrame()
{
setResizable(false);
setTitle("客户端");
setBounds(100,100,500,600);
btnSend = new JButton("发送");
btnSend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
if (csocketThread != null)
{
csocketThread.sendMsg(field.getText());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}); JPanel panel = new JPanel();
field = new JTextField(30);
panel.add(field);
panel.add(btnSend);
add(panel,BorderLayout.SOUTH);
txt = new JTextArea(20,20);
add(new JScrollPane(txt),BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
pack();
} public void printMsg(String s)
{
txt.append(s);
} public void setSoeckt(ClientSocketThread csocketThread)
{
this.csocketThread = csocketThread;
}
}public class SoketFrame
{
public static void main(String[] args)
{
ServerFrame serverFrame = new ServerFrame();
ServerSocketThread sthread =
ServerSocketThread.makeServerSocketThread(serverFrame);
new Thread(sthread).start(); ClientFrame clientFrame = new ClientFrame();
ClientSocketThread cthread = new ClientSocketThread(clientFrame);
clientFrame.setSoeckt(cthread);
cthread.start();
System.out.println("Hello World!");
}
}