java實(shí)現(xiàn)簡(jiǎn)單聊天軟件
本文為大家分享了java實(shí)現(xiàn)簡(jiǎn)單聊天軟件的具體代碼,供大家參考,具體內(nèi)容如下
介紹
這是我自己學(xué)習(xí)Socket時(shí)寫(xiě)的,用到了多線(xiàn)程,Socket的知識(shí),還有Java的IO技術(shù),并且做了一個(gè)Java的UI,廢話(huà)不多說(shuō),先上效果圖

SendThread
這個(gè)類(lèi)是用來(lái)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送的,當(dāng)按鍵按下時(shí),會(huì)調(diào)用sendMessage方法
public class SendThread {
ChatWindow chatWindow;
private String remoteIP = "";
private int port = 0;
private String message = "";
public SendThread(int port,ChatWindow window) {
chatWindow = window;
}
public void notRun() {
InetSocketAddress isa = new InetSocketAddress(remoteIP, port);
try {
Socket socket = new Socket();
socket.connect(isa);
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
writer.write(message);
writer.flush();
writer.close();
System.out.println("將數(shù)據(jù)寫(xiě)入到流中");
} catch (IOException e) {
e.printStackTrace();
}finally{
message = "";
}
}
public void senMessage(String host,int port,String message){
remoteIP = host;
this.port = port;
this.message = message;
notRun();
}
}
ReceiveThread
這個(gè)類(lèi)實(shí)現(xiàn)的功能是維護(hù)一個(gè)阻塞線(xiàn)程,來(lái)對(duì)端口進(jìn)行監(jiān)聽(tīng),接受收到的信息,每當(dāng)收到信息時(shí),都會(huì)顯示。
public class ReceiveThread extends Thread {
private ServerSocket server;
private ChatWindow window;
public ReceiveThread(ChatWindow window) {
this.window = window;
try {
server = new ServerSocket(0);
window.setLocalPort(server.getLocalPort());
start();
} catch (IOException e) {
// TODO Auto-generated catch block
window.printError("連接出錯(cuò)");
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
Socket socket;
try {
socket = server.accept();
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
int c;
StringBuilder sb = new StringBuilder();
while((c = reader.read()) != -1){
sb.append((char)c);
}
window.setReceive(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("線(xiàn)程將接受到的數(shù)據(jù)寫(xiě)入對(duì)話(huà)框出錯(cuò)");
}
}
}
}
ChatWindow
這個(gè)類(lèi)是UI的實(shí)現(xiàn),通過(guò)綁定各個(gè)按鈕的操作來(lái)實(shí)現(xiàn)別的功能
public class ChatWindow extends JFrame {
private JButton sendButton;
private JButton cancelButton;
private JButton receiveButton;
private JTextArea receiveText;
private JTextField sendText;
private JLabel localPort;
private JTextField remoteAddress;
private JTextField remotePort;
private SendThread sendThread;
private ReceiveThread receiveThread;
private void GUIini(){
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
setSize(400, 500);
//第一個(gè)panel
JPanel panel1 = new JPanel(new GridLayout(4, 2));
// JPanel panel1 = new JPanel(new (4, 2));
panel1.setSize(400, 75);
panel1.add(new JLabel("當(dāng)前機(jī)器的IP地址是:"));
try {
panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
panel1.add(new JLabel("當(dāng)前機(jī)器的IP地址是:" + "Unknown"));
}
panel1.add(new JLabel("當(dāng)前對(duì)話(huà)的端口是:"));
panel1.add(localPort = new JLabel(""+0));
panel1.add(new JLabel("Remote Host IP Address:"));
remoteAddress = new JTextField();
remoteAddress.setColumns(0);
panel1.add(remoteAddress);
panel1.add(new JLabel("Remote Host Port:"));
remotePort = new JTextField();
remotePort.setColumns(0);
panel1.add(remotePort);
c.add(panel1,BorderLayout.NORTH);
//第二個(gè)panel
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEADING));
panel2.setSize(400,200);
panel2.add(new JLabel("收到的內(nèi)容"));
receiveText = new JTextArea(15,30);
receiveText.setEditable(false);
receiveText.setAutoscrolls(true);
JScrollPane jsp = new JScrollPane(receiveText);
panel2.add(jsp);
//第三個(gè)panel
// JPanel panel3 = new JPanel(new GridLayout(2, 1));
panel2.add(new JLabel("請(qǐng)輸入發(fā)送的內(nèi)容"));
sendText = new JTextField(30);
sendText.setAutoscrolls(true);
panel2.add(sendText);
c.add(panel2,BorderLayout.CENTER);
//c.add(panel3);
//第四個(gè)panel
JPanel panel4 = new JPanel(new GridLayout(1, 0));
panel4.setSize(400,20);
receiveButton = new JButton("開(kāi)始接受數(shù)據(jù)");
sendButton = new JButton("發(fā)送");
cancelButton = new JButton("取消");
panel4.add(receiveButton);
panel4.add(cancelButton);
panel4.add(sendButton);
c.add(panel4,BorderLayout.SOUTH);
//四個(gè)面板內(nèi)容設(shè)置完畢
setVisible(true);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void ActionIni() {
//鍵盤(pán)動(dòng)作
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_ENTER){
//發(fā)送文本
sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());
receiveText.setText(receiveText.getText() + "\n" + "發(fā)送:" + sendText.getText());
}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
});
//取消按鈕的動(dòng)作
cancelButton.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
sendText.setText("");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
sendButton.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
//發(fā)送文本
sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());
receiveText.setText(receiveText.getText() + "發(fā)送:" + sendText.getText()+ "\n");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
private void ThreadIni() {
// TODO Auto-generated method stub
sendThread = new SendThread(0, this);
receiveThread = new ReceiveThread(this);
}
//構(gòu)造函數(shù)
public ChatWindow() {
GUIini();
ActionIni();
ThreadIni();
}
public void printError(String err){
System.out.println("Error occur:" + err);
}
//回調(diào)函數(shù),用于接受從線(xiàn)程中返回的數(shù)據(jù)
public void setReceive(String receive){
receiveText.setText(receiveText.getText() + "收到:" + receive+ "\n" );
}
//當(dāng)接受數(shù)據(jù)的線(xiàn)程開(kāi)始工作以后,就調(diào)用該回調(diào)函數(shù),設(shè)置當(dāng)前聊天窗口使用的端口是哪個(gè)
public void setLocalPort(int localPortText){
localPort.setText(""+localPortText);
}
//放遠(yuǎn),這個(gè)是整個(gè)程序的起點(diǎn)
public static void main(String[] args) {
// TODO Auto-generated method stub
new ChatWindow();
}
}
如何使用
將工程導(dǎo)入到Eclipse中以后,運(yùn)行兩次,因?yàn)檫@個(gè)程序不屬于單例模式,所以可以出現(xiàn)兩個(gè)窗口,在遠(yuǎn)程端口,遠(yuǎn)程地址那個(gè)輸入框中分別輸入另一個(gè)窗口中顯示的IP和端口號(hào),接下來(lái)在輸入框中輸入要發(fā)送的文字就可以了
源碼下載:java實(shí)現(xiàn)簡(jiǎn)單聊天軟件
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java實(shí)現(xiàn)基于Tcp的socket聊天程序
- Java基于Tcp/ip連接的多人交互聊天室
- java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
- java實(shí)現(xiàn)簡(jiǎn)單TCP聊天程序
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁(yè)聊天室實(shí)例代碼
- Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例
- 基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線(xiàn)聊天功能(一)
- java中UDP簡(jiǎn)單聊天程序?qū)嵗a
- java Socket實(shí)現(xiàn)網(wǎng)頁(yè)版在線(xiàn)聊天
- java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享
相關(guān)文章
如何在IDEA運(yùn)行spark程序(搭建Spark開(kāi)發(fā)環(huán)境)
spark程序可以通過(guò)pom.xml的文件配置,添加spark-core依賴(lài),可以直接在IDEA中編寫(xiě)spark程序并運(yùn)行結(jié)果,這篇文章主要介紹了如何在IDEA運(yùn)行spark程序(搭建Spark開(kāi)發(fā)環(huán)境),需要的朋友可以參考下2024-02-02
SpringBoot yaml中的數(shù)組類(lèi)型取值方式
這篇文章主要介紹了SpringBoot yaml中的數(shù)組類(lèi)型取值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java?SpringBoot?@Async實(shí)現(xiàn)異步任務(wù)的流程分析
這篇文章主要介紹了Java?SpringBoot?@Async實(shí)現(xiàn)異步任務(wù),主要包括@Async?異步任務(wù)-無(wú)返回值,@Async?異步任務(wù)-有返回值,@Async?+?自定義線(xiàn)程池的操作代碼,需要的朋友可以參考下2022-12-12
spring boot 2.x html中引用css和js失效問(wèn)題及解決方法
這篇文章主要介紹了spring boot 2.x html中引用css和js失效,需要的朋友可以參考下2018-11-11
Java字符串無(wú)意識(shí)的遞歸過(guò)程解析
這篇文章主要介紹了Java字符串無(wú)意識(shí)的遞歸過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Hadoop2.8.1完全分布式環(huán)境搭建過(guò)程
本文搭建了一個(gè)由三節(jié)點(diǎn)(master、slave1、slave2)構(gòu)成的Hadoop完全分布式集群(區(qū)別單節(jié)點(diǎn)偽分布式集群),并通過(guò)Hadoop分布式計(jì)算的一個(gè)示例測(cè)試集群的正確性。對(duì)hadoop分布式環(huán)境搭建過(guò)程感興趣的朋友跟隨小編一起看看吧2019-06-06
Java虛擬機(jī)類(lèi)加載器之雙親委派機(jī)制模型案例
這篇文章主要介紹了Java虛擬機(jī)類(lèi)加載器之雙親委派機(jī)制模型案例,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
SWT(JFace) 圖片瀏覽器 實(shí)現(xiàn)代碼
SWT(JFace)小制作:圖片瀏覽器2009-06-06

