導入Java . awt . event . *;
導入Java . io . io exception;
導入Java . net . *;
導入Java . io . *;
公共類chatClient擴展框架{
/**
* @param args
*/
TextField TF txt = new TextField();
TextArea taContent = new TextArea();
套接字s = null
DataOutputStream dos = null
DataInputStream dis = null
private boolean b connected = false;
公共靜態void main(String[] args) {
新聊天客戶端()。lunach frame();
}
私有類RecvThread實現Runnable{
公共無效運行(){
嘗試{
while(b已連接){
string str = dis . read utf();
tacontent . settext(tacontent . gettext()+str+' \ n ');
}
}catch(IOException e){
e . printstacktrace();
}
}
}
public void lunachFrame(){
this.setLocation(400,300);
this.setSize(300,300);
//this . set layout(new FlowLayout());
this.add(tfTxT," South ");
this.add(taContent," North ");
pack();
TF txt . addactionlistener(new TF listener());
this . addwindowlistener(new window close());
this . set visible(true);
connect();
新線程(新RecvThread())。start();
}
公共void connect(){
嘗試{
s=新插座(" 127.0.0.1 ",8888);
dos = new data output stream(s . get output stream());
dis = new data inputstream(s . getinputstream());
System.out.println("connected!");
bConnected = true
} catch (UnknownHostException e) {
e . printstacktrace();
} catch (IOException e) {
e . printstacktrace();
}
}
公共void disconnect(){
嘗試{
dos . close();
s . close();
} catch(異常e) {
// TODO自動生成catch塊。
e . printstacktrace();
}
}
類WindowClose擴展WindowAdapter{
@覆蓋
public void window closing(window event e){
// TODO自動生成方法存根
system . exit(0);
disconnect();
}
}
私有類TFListener實現ActionListener{
public void action performed(action event e){
String str=tfTxT.getText()。trim();//trim刪除兩邊的空格。
//tacontent . settext(str);
TF txt . settext(" ");
嘗試{
dos . write utf(str);
dos . flush();
//dos . close();
} catch (IOException e1) {
e 1 . printstacktrace();
}
}
}
}
======================================
導入Java . io . io exception;
導入Java . net . *;
導入Java . io . *;
導入Java . util . *;
公共類ChatServer {
列表& lt客戶端& gtclients = new ArrayList & lt客戶端& gt();
客戶端c =空;
公共靜態void main(String[] args){
新的ChatServer()。start();
}
public void start(){
boolean started = false
ServerSocket ss = null
DataInputStream dis = null
嘗試{
ss = new server socket(8888);
開始=真;
}catch(異常e)
{
e . printstacktrace();
}
嘗試{
當(開始){
socket s = ss . accept();
c =新客戶;//啟動線程,實現run()方法。
System.out.println("客戶端已連接!");
新線程(c)。start();//啟動start方法。循環。start是Thread中的壹個方法,與上面的start無關。
clients . add(c);
//dis . close();
}
} catch(異常e) {
//e . printstacktrace();
}
最後{
嘗試{
ss . close();
} catch (IOException e) {
// TODO自動生成catch塊。
e . printstacktrace();
}
}
}
類客戶端實現Runnable{
私有套接字s;
私有DataInputStream dis = null
private boolean b connected = false;
private data output stream dos = null;
公共客戶端(套接字){
this.s = s
嘗試{
dis = new data inputstream(s . getinputstream());
dos = new data output stream(s . get output stream());
bConnected = true
} catch (IOException e) {
// TODO自動生成catch塊。
e . printstacktrace();
}
}
公共void send(字符串str)引發異常{
dos . write utf(str);
}
公共無效運行(){
嘗試{
while(b已連接){
string str = dis . read utf();
system . out . println(str);
for(int I = 0;我& ltclients . size();i++){
c = clients . get(I);
發送(str);
}
/*for(叠代器& lt客戶端& gtit = clients . iterator();it . has next();){
client c = it . next();
發送(str);
}*/
}
}catch(SocketException e){
clients.remove(此);
System.out.println("客戶離線");
}
捕捉(異常e){
System.out.println("客戶端關閉");
}
捕捉(異常e){
//e . printstacktrace();
}
最後{
嘗試{
如果(dis!= null)dis . close();
如果(dos!= null)dos . close();
如果(s!= null)s . close();
} catch(異常e1) {
// TODO自動生成catch塊。
//e 1 . printstacktrace();
}
}
}
}
}
首先是客戶,
第二個是服務器端。