//ServeOneSocket.java 服务端源程序import java.io.*; import java.net.*;public class ServeOneSocket extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; private String content; /** * Constructor */ public ServeOneSocket(Socket s,String c)throws IOException { socket=s; content=c; in=new BufferedReader( new InputStreamReader( socket.getInputStream())); //enable auto-flush out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())),true); start();//calls run() } public void run(){ try{ while (true){ String str=in.readLine(); if (str.equals("END"))break; System.out.println("Echoing:"+str); out.println(str); out.println(content); } System.out.println("Closing..."); }catch(IOException e){ }finally{ try{ socket.close(); }catch(IOException e){} } } }//SocketClientThread.java 客户端源程序import java.net.*; import java.io.*;class SocketClientThread extends Thread{ private Socket socket; private BufferedReader in; private PrintWriter out; private static int counter=0; private int id=counter++; private static int threadcount=0; final int port=8110; public static int threadCount(){ return threadcount; } public SocketClientThread(InetAddress addr){ System.out.println("Making client:"+id); threadcount++; try{ socket=new Socket(addr,port); }catch(IOException e){ } try{ in=new BufferedReader( new InputStreamReader( socket.getInputStream())); out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())),true); start(); }catch(IOException e){ try{ socket.close(); }catch(IOException e2){} } } public void run(){ try{ for (int i=0;i<25;i++){ out.println("Client:"+id+":"+i); String str=in.readLine(); System.out.println(str); } out.println("END"); }catch(IOException e){ }finally{ try{ socket.close(); }catch(IOException e){} threadcount--; } } }public class MultiSocketClient { static final int MAX_THREADS=10; /** * main * @param args */ public static void main(String[] args)throws IOException,InterruptedException { InetAddress addr=InetAddress.getByName(null); while (true){ if (SocketClientThread.threadCount()<MAX_THREADS) new SocketClientThread(addr); Thread.currentThread().sleep(100); } } }
Client.java /* * Created on 2004/10/14 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package chatserver.easychat;import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Label; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket;/** * @author guest1 * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class Client extends Frame implements ActionListener,Runnable{ private TextField tf1,tf2; private Label la1,la2; private TextArea ta1,ta2; private Socket s; private Button b,l; private BufferedReader br = null; private PrintWriter pw = null;
public static void main(String args[]){ new Client(); }
public Client(){ setLayout(new GridLayout(6,1)); Panel panel = new Panel(); tf1 = new TextField(20); tf2 = new TextField(10); la1 = new Label("IP:"); la2 = new Label("port:"); Button l = new Button("connect"); l.setBackground(Color.GRAY); panel.add(tf1); panel.add(la1); panel.add(tf2); panel.add(la2); panel.add(l); add(panel); ta1 = new TextArea(500,300); add(new Label("messages")); add(ta1);
add(new Label("input")); ta2 = new TextArea(30,300); add(ta2); Panel p2 = new Panel(); b = new Button("send"); b.setBackground(Color.YELLOW); p2.add(b); add(p2); setTitle("Client"); setSize(300,450); setResizable(false); setVisible(true); l.addActionListener(this); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent exit){ System.exit(0); } }); Thread ThreadReader = new Thread(this); ThreadReader.start(); b.addActionListener(this); }
public void actionPerformed(ActionEvent e){ String command = e.getActionCommand(); if("send".equals(command)){ if(ta2.getText().trim()!=null){ ta1.append("\n message from Client:\n"+ta2.getText()); pw.println(ta2.getText()+"\n"); }else if(ta2.getText().trim()==null){ ta1.append("\n please input your IP and \n"+"message can't be null"); ta2.setText(""); } }else if("connect".equals(command)){ try{ s = new Socket(tf1.getText().toString(),Integer.parseInt(tf2.getText().trim())); br = new BufferedReader(new InputStreamReader(s.getInputStream())); pw = new PrintWriter(s.getOutputStream(),true); }catch(Exception ex){ ex.printStackTrace(); } } } }
Server.java /* * Created on 2004/10/14 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package chatserver.easychat;import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*;/** * @author guest1 * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class Server{ public static void main(String args[]){ ServerService MyServer = new ServerService(8000,10); } }
ServerService.java /* * Created on 2004/10/14 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package chatserver.easychat;import java.io.*; import java.net.*; import java.awt.event.*; import java.awt.*;/** * @author guest1 * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class ServerService extends Frame{ ServerSocket Listener; TextArea ListenerMeg; ServiceThread MyST; public ServerService(int port,int Count){ try{ Listener = new ServerSocket(port,Count); setTitle("Listen for Server"); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ ((Frame)e.getWindow()).dispose(); System.exit(0); } }); setLayout(new BorderLayout()); ListenerMeg=new TextArea("listener is run\n",10,50); add("Center",ListenerMeg); setResizable(false); pack();
import java.net.*;public class ServeOneSocket extends Thread { private Socket socket;
private BufferedReader in;
private PrintWriter out;
private String content; /**
* Constructor
*/
public ServeOneSocket(Socket s,String c)throws IOException {
socket=s;
content=c;
in=new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
//enable auto-flush
out=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
start();//calls run()
} public void run(){
try{
while (true){
String str=in.readLine();
if (str.equals("END"))break;
System.out.println("Echoing:"+str);
out.println(str);
out.println(content);
}
System.out.println("Closing...");
}catch(IOException e){
}finally{
try{
socket.close();
}catch(IOException e){}
}
}
}//SocketClientThread.java 客户端源程序import java.net.*;
import java.io.*;class SocketClientThread extends Thread{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private static int counter=0;
private int id=counter++;
private static int threadcount=0;
final int port=8110; public static int threadCount(){
return threadcount;
} public SocketClientThread(InetAddress addr){
System.out.println("Making client:"+id);
threadcount++;
try{
socket=new Socket(addr,port);
}catch(IOException e){
}
try{
in=new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
out=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
start();
}catch(IOException e){
try{
socket.close();
}catch(IOException e2){}
}
} public void run(){
try{
for (int i=0;i<25;i++){
out.println("Client:"+id+":"+i);
String str=in.readLine();
System.out.println(str);
}
out.println("END");
}catch(IOException e){
}finally{
try{
socket.close();
}catch(IOException e){}
threadcount--;
}
}
}public class MultiSocketClient {
static final int MAX_THREADS=10;
/**
* main
* @param args
*/
public static void main(String[] args)throws IOException,InterruptedException {
InetAddress addr=InetAddress.getByName(null);
while (true){
if (SocketClientThread.threadCount()<MAX_THREADS)
new SocketClientThread(addr);
Thread.currentThread().sleep(100);
}
}
}
/*
* Created on 2004/10/14
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package chatserver.easychat;import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;/**
* @author guest1
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Client extends Frame implements ActionListener,Runnable{
private TextField tf1,tf2;
private Label la1,la2;
private TextArea ta1,ta2;
private Socket s;
private Button b,l;
private BufferedReader br = null;
private PrintWriter pw = null;
public static void main(String args[]){
new Client();
}
public Client(){
setLayout(new GridLayout(6,1));
Panel panel = new Panel();
tf1 = new TextField(20);
tf2 = new TextField(10);
la1 = new Label("IP:");
la2 = new Label("port:");
Button l = new Button("connect");
l.setBackground(Color.GRAY);
panel.add(tf1);
panel.add(la1);
panel.add(tf2);
panel.add(la2);
panel.add(l);
add(panel);
ta1 = new TextArea(500,300);
add(new Label("messages"));
add(ta1);
add(new Label("input"));
ta2 = new TextArea(30,300);
add(ta2);
Panel p2 = new Panel();
b = new Button("send");
b.setBackground(Color.YELLOW);
p2.add(b);
add(p2);
setTitle("Client");
setSize(300,450);
setResizable(false);
setVisible(true);
l.addActionListener(this);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent exit){
System.exit(0);
}
});
Thread ThreadReader = new Thread(this);
ThreadReader.start();
b.addActionListener(this);
}
public void run(){
while(true){
try{
ta1.append("\n#_______________________#\n"+br.readLine());
}catch(Exception e){
e.printStackTrace();
}
}
}
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
if("send".equals(command)){
if(ta2.getText().trim()!=null){
ta1.append("\n message from Client:\n"+ta2.getText());
pw.println(ta2.getText()+"\n");
}else if(ta2.getText().trim()==null){
ta1.append("\n please input your IP and \n"+"message can't be null");
ta2.setText("");
}
}else if("connect".equals(command)){
try{
s = new Socket(tf1.getText().toString(),Integer.parseInt(tf2.getText().trim()));
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream(),true);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
}
/*
* Created on 2004/10/14
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package chatserver.easychat;import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;/**
* @author guest1
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Server{
public static void main(String args[]){
ServerService MyServer = new ServerService(8000,10);
}
}
/*
* Created on 2004/10/14
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package chatserver.easychat;import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;/**
* @author guest1
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class ServerService extends Frame{
ServerSocket Listener;
TextArea ListenerMeg;
ServiceThread MyST;
public ServerService(int port,int Count){
try{
Listener = new ServerSocket(port,Count);
setTitle("Listen for Server");
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
((Frame)e.getWindow()).dispose();
System.exit(0);
}
});
setLayout(new BorderLayout());
ListenerMeg=new TextArea("listener is run\n",10,50);
add("Center",ListenerMeg);
setResizable(false);
pack();
show();
while(true){
Socket connected = Listener.accept();
InetAddress ClientAdress = connected.getInetAddress();
ListenerMeg.append("\n Client conntectd from :"+ClientAdress);
MyST = new ServiceThread(this,connected);
MyST.ConnectedThread.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public void addMeg(String s){
ListenerMeg.append(s);
}
}
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.io.*;
import java.net.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ClientFrame extends JFrame {
JPanel contentPane;
XYLayout xYLayout1 = new XYLayout();
Label label1 = new Label();
TextField textField1 = new TextField();
Button button1 = new Button();
TextArea textArea1 = new TextArea();
Label label2 = new Label();
TextField textField2 = new TextField();
Button button2 = new Button();
Socket client;
InputStream input; //socket输入流
OutputStream output; // socket输出流
//Construct the frame
public ClientFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
//----------------界面处理部分-----------------------------//
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
label1.setFont(new java.awt.Font("Dialog", 0, 14));
label1.setText("发送消息");
contentPane.setLayout(xYLayout1);
this.setSize(new Dimension(400, 340));
this.setTitle("Client");
textField1.setText("");
button1.setLabel("发送");
button1.addActionListener(new ClientFrame_button1_actionAdapter(this));
label2.setText("服务器");
label2.setFont(new java.awt.Font("Dialog", 0, 14));
textField2.setText("");
button2.setLabel("连接");
button2.addActionListener(new ClientFrame_button2_actionAdapter(this));
textArea1.setText("");
contentPane.add(textField1, new XYConstraints(78, 10, 158, 25));
contentPane.add(button1, new XYConstraints(255, 11, 67, -1));
contentPane.add(textArea1, new XYConstraints(26, 47, 338, 194));
contentPane.add(label2, new XYConstraints(25, 260, -1, -1));
contentPane.add(textField2, new XYConstraints(79, 261, 167, 25));
contentPane.add(button2, new XYConstraints(266, 259, 67, -1));
contentPane.add(label1, new XYConstraints(9, 12, -1, -1));
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
/*----开启客户端,连接服务器,发送自己的IP信息,
接收服务器的返回信息
*/
public void runClient(){
try{
client = new Socket(InetAddress.getByName(textField2.getText()),5000);
output = client.getOutputStream();//没有此行代码,消息不能发送出去
Thread t = new Thread(){
public void run() {
String inStr = new String();
char c;
try {
while(true){
inStr = ""; //解决输入信息累加问题
input = client.getInputStream();
while ((c = (char) input.read()) != '\n')
inStr = inStr + String.valueOf(c);
inStr += "\n"; //去掉不能实现广播和换行
textArea1.append(inStr);}
}catch (IOException ex) {}
}
};
t.start();
}catch(Exception e){} } void button2_actionPerformed(ActionEvent e) {
String s = new String();
if(button2.getLabel() == "连接"){
runClient(); //开启客户端,连接服务器
button2.setLabel("停止");
button1.enable(true);
}
else{
button2.setLabel("连接");
try{
output = client.getOutputStream();
s = "goodbye\n";
textArea1.append(s);
for (int i = 0;i<s.length();i++)
output.write((int)s.charAt(i));
client.close();
button1.enable(false);
System.exit(0);
}catch(Exception ex){}
}
}/*-------------------------发送按钮处理函数,请实现发送的功能-----------
注意:服务器端的动作是:接到的只要不是"goodbye",就把该消息立即发给客户端
*/
void button1_actionPerformed(ActionEvent e) {
String str = new String();
try{
str = textField1.getText() + "\n";
for (int i = 0;i<str.length();i++)
output.write((int)str.charAt(i));
//textArea1.append(str); //此行代码会在发送消息的客户端显示输入的消息
str = "";
}catch(Exception ec){} }}
class ClientFrame_button2_actionAdapter implements java.awt.event.ActionListener {
ClientFrame adaptee; ClientFrame_button2_actionAdapter(ClientFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button2_actionPerformed(e);
}
}class ClientFrame_button1_actionAdapter implements java.awt.event.ActionListener {
ClientFrame adaptee; ClientFrame_button1_actionAdapter(ClientFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button1_actionPerformed(e);
}
}
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ServrFrame extends JFrame {
JPanel contentPane;
XYLayout xYLayout1 = new XYLayout();
Label label1 = new Label();
List list1 = new List();
Button button1 = new Button();
TextArea textArea1 = new TextArea();
ServrFrame sf;
ServerSocket server;
Socket connection; //连接后的socket对象
OutputStream output; //输出流
InputStream input; //输入流
Vector v = new Vector(); //Construct the frame
public ServrFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
label1.setFont(new java.awt.Font("Dialog", 0, 14));
label1.setText("客户端");
contentPane.setLayout(xYLayout1);
this.setSize(new Dimension(400, 324));
this.setTitle("ServerFrame");
button1.setLabel("运行服务器");
button1.addActionListener(new ServrFrame_button1_actionAdapter(this));
contentPane.add(label1, new XYConstraints(17, 9, 45, 26));
contentPane.add(list1, new XYConstraints(19, 37, 153, 249));
contentPane.add(button1, new XYConstraints(230, 8, 94, 23));
contentPane.add(textArea1, new XYConstraints(201, 37, 170, 249));
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
//此函数完成开启服务的功能
public void runServer(){
sf = this;
Thread t = new Thread(){
public void run(){
try{
server = new ServerSocket(5000,100);
while(true){
connection = server.accept();
ServerThread s = new ServerThread(connection,sf);
v.add(s);
s.start();
}
}catch(Exception e){}
}
};
t.start(); }// ----------启动/停止服务器的处理函数--------------------//
void button1_actionPerformed(ActionEvent e) {
if(button1.getLabel().compareTo("运行服务器")==0){
button1.setLabel("停止服务器");
runServer();
}
else
System.exit(0);
}
}class ServrFrame_button1_actionAdapter implements java.awt.event.ActionListener {
ServrFrame adaptee; ServrFrame_button1_actionAdapter(ServrFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button1_actionPerformed(e);
}
}
import java.io.*;
import java.net.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ServerThread extends Thread{
Socket connection;
InputStream input;
OutputStream output;
ServrFrame sf;
public ServerThread(Socket so, ServrFrame s) {
connection = so;
sf = s;
try {
input = connection.getInputStream();
output = connection.getOutputStream();
sf.list1.add(connection.getInetAddress().toString() + ":" +
connection.getPort());
}catch (IOException ioe) {}
}public void run() {
String str = new String();
while (true) {
try {
str= "";
char c;
while ( (c = (char) input.read()) != '\n')//出错原因所在,多加了个;,不能广播
str = str + String.valueOf(c);
str += "\n";
sf.textArea1.append("From Client " + connection.getPort() + ":");
sf.textArea1.append(str);
//str = ""; //此行代码应该注释掉,服务器收到消息不会发给另外的客户机
if (str.compareTo("goodbye" + "\n") == 0) {
sf.textArea1.append(connection.getInetAddress().toString() + "断开\n");
sf.list1.remove(connection.getInetAddress().toString() + ":" +
connection.getPort());
sf.v.remove(this);
connection.close();
break;
}
for (int i=0;i<sf.v.size();i++){
ServerThread st = (ServerThread)sf.v.elementAt(i);
st.sendMsg(connection.getInetAddress() + ":" + connection.getPort() + ":" + str);
}
}catch (IOException e) {}
}
}public void sendMsg(String outstr) {
try {
output = connection.getOutputStream();
for (int i = 0; i < outstr.length(); i++)
output.write( (int) outstr.charAt(i));
//outstr = "";
}catch (IOException e) {}
}
}