多线程网络编程
2009-09-16 16:59
363 查看
package cn.meiwenhui.swi; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ChatClient { public static void main(String[] args) { ChatClient cc = new ChatClient(); cc.receive(); } JTextField jtf; // 文本条 JTextArea jta; // 文本域。 Socket s; // 客户端 PrintWriter out; // 输出流 BufferedReader in; // 输入流 public ChatClient() { JFrame frame = new JFrame("ChatClient");// 窗口 frame.setSize(400, 300); // 大小 jta = new JTextArea(); // 文本域 jta.setEditable(false); // 不可编辑 jtf = new JTextField();// 文件条 jtf.addActionListener(new ActionListener() { // 添加监听。 public void actionPerformed(ActionEvent arg0) { send(); // 调用send()方法 } }); frame.getContentPane().add(new JScrollPane(jta)); // 添加滚动条 frame.getContentPane().add(jtf, "South"); // 添加文本条 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口。 frame.setVisible(true); // 可显示的。 try { s = new Socket("127.0.0.1", 9000); // 连接服务端 socket("主机名",端口号); in = new BufferedReader(new InputStreamReader(s.getInputStream())); // 建立输入流 out = new PrintWriter(s.getOutputStream());// 输出流 } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void receive() { // 接受服务端发来别的客户端的信息。 while (true) { try { String text = in.readLine(); // 读一行 this.jta.append("$#$ : " + text + "/n"); // jta 添加上读入的。 } catch (IOException e) { e.printStackTrace(); return; } } } public void send() { // 发送消息 String text = this.jtf.getText(); // 得到你输入的消息 this.jtf.setText(""); // 在文本域中显示你输入的消息。 out.println(text); // 打印出。 out.flush(); // 清空 } } /*********************************************/ package cn.meiwenhui.swi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ChatServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(9000); // 建立服务端,端口号为9000 List<Socket> list = new ArrayList<Socket>(); // 创建个List集合。 while (true) { Socket s = ss.accept(); // 等待客户端的请求。 list.add(s); // 把每一个client都add到集合中去。 Thread t = new ServerThread(s, list); // 线程。 t.start(); // 启动。 } } } class ServerThread extends Thread { Socket s; List<Socket> list; BufferedReader in; PrintWriter out; /** * 构造。传入socket和list。 **/ public ServerThread(Socket s, List<Socket> list) { this.s = s; this.list = list; try { in = new BufferedReader(new InputStreamReader(s.getInputStream())); // 输入流 out = new PrintWriter(s.getOutputStream()); // 输出流 } catch (IOException e) { e.printStackTrace(); } } /** * 必须实现其run()方法。 **/ public void run() { while (true) { try { String str = in.readLine(); // 得到client端的message。 if (str == null) // 如果没有消息就返回。 return; Iterator<Socket> it = list.iterator(); // 遍历list。 while (it.hasNext()) { // 如果list有下一个 Socket socket = it.next(); // 因为list中都是存的socket PrintWriter o = new PrintWriter(socket.getOutputStream()); // 输出流 o.println(str); // 输出 o.flush(); // 清空 } } catch (IOException e) { e.printStackTrace(); return; } } } }
相关文章推荐
- Java笔记(9)-网络编程、URL、InetAddress、套接字、Socket、ServerSocket、多线程、UDP、广播数据包、远程调用
- 【Linux网络编程】基于TCP的多线程(pthread)版本最简陋的HTTP服务器
- 网络游戏服务器断编程学习之多线程
- 关于网络编程架构的初步学习,多线程编程。
- 网络编程中设计并发服务器,使用多进程与多线程有什么区别?
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
- [零散篇]Java学习笔记---Java的Socket网络编程以及多线程
- core java 10~12(多线程 & I/O & Network网络编程)
- 多线程和网络编程实践——LittleTom
- 网络编程基础--多线程
- Java多线程与网络编程
- ios 网络编程总结-多线程
- TCP-IP学习笔记四:NIO的网络编程-多线程实例
- 【python网络编程】多线程实现多用户全双工聊天
- day_06_多线程、网络编程
- Linux网络编程 之 TCP 多线程的服务器和客户端同时收发数据
- 多线程与网络编程
- Python网络编程之多线程入门教程【python教程入门】
- Linux 多线程 网络编程 管道 socket等相关心得
- Linux Socket 网络编程 基于GTK+ 的多线程实现的局域网通信软件