基於Java Socket完成一個簡略單純在線聊天功效(一)。本站提示廣大學習愛好者:(基於Java Socket完成一個簡略單純在線聊天功效(一))文章只能為提供參考,不一定能成為您想要的結果。以下是基於Java Socket完成一個簡略單純在線聊天功效(一)正文
比來做了一個項目,個中有一個在線網頁交換的需求,很久沒寫代碼了,手都陌生了,因而先寫demo練練手,分享到平台,以此做個記載,便利本身和年夜家應用。
先給年夜家說下完成步調分如許幾年夜步:
1、應用awt組件和socket完成簡略的單客戶端向辦事端連續發送新聞;
2、聯合線程,完成多客戶端銜接辦事端發送新聞;
3、完成辦事端轉發客戶端新聞至一切客戶端,同時在客戶端顯示;
4、把awt組件生成的窗口界面改成前端jsp或許html展現的界面,java socket完成的客戶端改成前端技巧完成。
這裡起首完成第一步的簡略功效,難點在於:
1、沒有效過awt組件,沒有效過java相干的監聽事宜;
2、長時光沒有應用socket停止客戶端和辦事真個交互,而且沒有真正停止過cs構造的開辟。
完成功效的代碼以下:
客戶端:
package chat.chat;
import java.awt.BorderLayout;
import java.awt.Frame;
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.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 在線聊天客戶端 1、生成圖形窗口界面輪廓 2、為輪廓添加封閉事宜 3、在輪廓中參加輸出區域和內容展現區域 4、為輸出區域添加回車事宜
* 5、樹立辦事端銜接並發送數據
*
* @author tuzongxun123
*
*/
public class ChatClient extends Frame {
// 用戶輸出區域
private TextField tfTxt = new TextField();
// 內容展現區域
private TextArea tarea = new TextArea();
private Socket socket = null;
// 數據輸入流
private DataOutputStream dataOutputStream = null;
public static void main(String[] args) {
new ChatClient().launcFrame();
}
/**
* 樹立一個簡略的圖形化窗口
*
* @author:tuzongxun
* @Title: launcFrame
* @param
* @return void
* @date May 18, 2016 9:57:00 AM
* @throws
*/
public void launcFrame() {
setLocation(300, 200);
this.setSize(200, 400);
add(tfTxt, BorderLayout.SOUTH);
add(tarea, BorderLayout.NORTH);
pack();
// 監聽圖形界面窗口的封閉事宜
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
disConnect();
}
});
tfTxt.addActionListener(new TFLister());
setVisible(true);
connect();
}
/**
* 銜接辦事器
*
* @author:tuzongxun
* @Title: connect
* @param
* @return void
* @date May 18, 2016 9:56:49 AM
* @throws
*/
public void connect() {
try {
// 新建辦事端銜接
socket = new Socket("127.0.0.1", 8888);
// 獲得客戶端輸入流
dataOutputStream = new DataOutputStream(socket.getOutputStream());
System.out.println("連上辦事端");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 封閉客戶端資本
*
* @author:tuzongxun
* @Title: disConnect
* @param
* @return void
* @date May 18, 2016 9:57:46 AM
* @throws
*/
public void disConnect() {
try {
dataOutputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 向辦事端發送新聞
*
* @author:tuzongxun
* @Title: sendMessage
* @param @param text
* @return void
* @date May 18, 2016 9:57:56 AM
* @throws
*/
private void sendMessage(String text) {
try {
dataOutputStream.writeUTF(text);
dataOutputStream.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
/**
* 圖形窗口輸出區域監聽回車事宜
*
* @author tuzongxun123
*
*/
private class TFLister implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String text = tfTxt.getText().trim();
tarea.setText(text);
tfTxt.setText("");
// 回車後發送數據到辦事器
sendMessage(text);
}
}
}
辦事端:
package chat.chat;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* java應用socket和awt組件簡略完成在線聊天功效辦事端 可以完成一個客戶端銜接後赓續向辦事端發送新聞
* 但不支撐多個客戶端同時銜接,緣由在於代碼中取得客戶端銜接後會一向輪回監聽客戶端輸出,形成壅塞
* 以致於辦事端沒法二次監聽別的的客戶端,如要完成,須要應用異步或許多線程
*
* @author tuzongxun123
*
*/
public class ChatServer {
public static void main(String[] args) {
// 能否勝利啟動辦事端
boolean isStart = false;
// 辦事端socket
ServerSocket ss = null;
// 客戶端socket
Socket socket = null;
// 辦事端讀取客戶端數據輸出流
DataInputStream dataInputStream = null;
try {
// 啟動辦事器
ss = new ServerSocket(8888);
} catch (BindException e) {
System.out.println("端口已在應用中");
// 封閉法式
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
try {
isStart = true;
while (isStart) {
boolean isConnect = false;
// 啟動監聽
socket = ss.accept();
System.out.println("one client connect");
isConnect = true;
while (isConnect) {
// 獲得客戶端輸出流
dataInputStream = new DataInputStream(
socket.getInputStream());
// 讀取客戶端傳遞的數據
String message = dataInputStream.readUTF();
System.out.println("客戶端說:" + message);
}
}
} catch (EOFException e) {
System.out.println("client closed!");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 封閉相干資本
try {
dataInputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
以上所述是小編給年夜家引見的Java Socket完成一個簡略單純在線聊天功效(一)的相干常識,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!