您的位置:首页 > 理论基础 > 计算机网络

多线程网络编程

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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: