以下程序在jdk1.4.1中調試通過;
OS : Windows XP
本程序有一個空發消息的處理問題,希望大家多多指教!
mainto:yzmhacke.163.com
客戶端的程序:
//Client.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
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;
// static String port,ip;
public static void main(String arg[]) {
new Client();
//if(arg[0].length()!=0) ip=arg[0];
//if(arg[1].length()!=0) port=arg[1];
}
//完成構造函數的說明
public Client(){
//完成ip地址與端口的建立
setLayout(new GridLayout(6,1));
Panel panel=new Panel();
tf1=new TextField(20);
tf2=new TextField(10);
la1=new Label("IP地址 ");
la2=new Label("對應端口 ");
Button l=new Button("連接");
l.setBackground(Color.green);
//l.addActionListener(this);
panel.add(la1);
panel.add(tf1);
panel.add(la2);
panel.add(tf2);
panel.add(l);
add(panel);
//輸入框與顯示框
ta1=new TextArea(100,300);
add(new Label("消息框"));
add(ta1);
add(new Label("用戶輸入框"));
ta2=new TextArea(30,300);
add(ta2);
Panel p2=new Panel();
b=new Button("發送");
b.setBackground(Color.yellow);
p2.add(b);
add(p2);
setTitle("客戶端");
setSize(300,450);
setResizable(false);
setVisible(true);
//捕獲各種的異常
l.addActionListener(this);
// b.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 exo){}
}
}
//客戶向服務端發送消息啊!
public void actionPerformed(ActionEvent e)
{ String command=e.getActionCommand();
if("發送".equals(command))
{
if(ta2.getText().trim()!=null)
{
ta1.append("/n 客戶端的消息:/n"+ta2.getText());
pw.println(ta2.getText()+"/n");//" /n 客戶短信: /n "
}
else
if(ta2.getText().trim()==null)
{ ta1.append("請輸入完整的IP地址與端口以及、/n"+"不能空發消息");}
ta2.setText(" "); //結束的時候清空文本框
}
else
if("連接".equals(command)){
try
{
//藉助連接的按鈕完成遠程pc的連接的工作。建立輸入與輸出流兩個工具
s=new Socket(tf1.getText().toString(),Integer.parseInt((tf2.getText()).trim()));
//Integer.parseInt((tf2.getText()).trim())
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
pw=new PrintWriter(s.getOutputStream(),true);
//ta1.append("/n 服務端來消息:/n"+br.readLine());
}
catch(Exception ex){
//ta1.append("產生了輸入輸出異常無法完成交互!");
}
}
}
}
/*******************服務端的程序*************************/
//Server.java
package server;
import java.io.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
public class Server{
public static void main(String arg[]){
ServerService MyServer=new ServerService(8000,10);
}
}
//交互端的服務窗口
class ServiceThread extends Frame
implements ActionListener,Runnable{
ServerService FatherListener;
Socket ConnectedClient;
Thread ConnectedThread;
Panel ListenePanel;
TextArea ServerMeg;
TextArea ServerWrite;
Label la;
Button bt;
BufferedReader in;
PrintWriter out;
public ServiceThread(ServerService sv,Socket s){
//容器與格子組建的結合
FatherListener=sv;
ConnectedClient=s;
ConnectedThread =new Thread(this);
//採用線程的目的是利用他的併發機制,實現多個任務
//在當前的類中(this)通過Runnabel()接口實現Thread()的Run()方案
setTitle("Answer Client");
setLayout(new GridLayout(4,1));
//採用格子組建的形式完成組建的安排
ServerMeg=new TextArea(null,5,45,TextArea.SCROLLBARS_VERTICAL_ONLY);
//添加各種組建到容器當中
ListenePanel=new Panel();
ListenePanel.add(ServerMeg);
add(ListenePanel);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
//((Frame)e.getWindow()).dispose();//保留的語句
System.exit(0);
}});
//第二個Panel()
la=new Label("服務端消息輸入框...............");
add(la);
ServerWrite=new TextArea(10,50);
add(ServerWrite);
//add(p2);
setSize(355,360);
Panel p3=new Panel();
bt=new Button("傳送");
bt.addActionListener(this);
p3.add(bt);
add(p3);
setResizable(false);
show();
InetAddress ClientAddress=ConnectedClient.getInetAddress();
ServerMeg.append("Client Conneted from /n "+ClientAddress.getHostAddress()+"!");
}
//完成事件的部
//面臨的一個問題是空發消息
public void actionPerformed(ActionEvent ex){
if(ex.getSource()==bt){
if((int)((ServerWrite.getText().toString()).length())!=0)
ServerMeg.append("服務端消息:"+ServerWrite.getText()+"/n");
out.println("/n"+ServerWrite.getText());
ServerWrite.setText("");
}
else {
ServerMeg.append("系統提示: 不能空法消息!/n");
}
}
// 覆蓋線程的run()方法
public void run(){
try{
in=
new BufferedReader(new InputStreamReader(ConnectedClient.getInputStream()));
out=new PrintWriter(ConnectedClient.getOutputStream(),true);
out.println("Hello! Wellocme connect our server !");
out.flush();
String s=in.readLine();
if(s.equals("bye"))
out.println("已經斷開與服務器的連接.............. /n 歡 迎 下 次 觀 顧!");
while(!s.equals("bye")){
ServerMeg.append("/n#_________________________________________#/n"+s);
s=in.readLine();
}
ConnectedClient.close();
}catch(Exception e){}
FatherListener.addMeg("Client"+"Cloesd."+"/n");
}//run(),finished;
}
//服務窗口
class ServerService extends Frame{
ServerSocket Listener;
TextArea ListenerMeg;
public ServerService(int port,int Count){
try{
Listener=new ServerSocket(port,Count);//開啓監聽的端口
setTitle("服務監聽");
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
((Frame)e.getWindow()).dispose();//釋放組建與內存
System.exit(0);
}});
setLayout(new BorderLayout());
ListenerMeg=new TextArea("監聽服務已經啓動 /n",10,50);
add("Center",ListenerMeg);
setResizable(false);//設計固定的狀態
pack();//重新的打包
show();
while(true){
Socket connected=Listener.accept();//等待外部的連接,直到連接成功才返回一個套接字
InetAddress ClientAddress=connected.getInetAddress();
ListenerMeg.append("/n Client connected from :/n"+ ClientAddress.toString());
ServiceThread MyST=new ServiceThread(this,connected);//初使化服務線程
//this指向當前對象的指針
MyST.ConnectedThread.start();//啓動線程
} //獲取套接子,激活線程,採用循環的語句解決方式
}catch(Exception ep){}
}
public void addMeg(String s){
ListenerMeg.append(s);
}
}