java Socket簡(jiǎn)易聊天工具
本文實(shí)例為大家分享了一款Socket簡(jiǎn)易聊天工具,希望大家喜歡。
代碼運(yùn)行如圖,看起來(lái)還不錯(cuò)

服務(wù)端
package qiu;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.Printable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 簡(jiǎn)單聊天軟件的服務(wù)器
* */
public class MyServer extends JFrame implements ActionListener{
JTextArea jTextArea =null;//用來(lái)顯示純文本的單行區(qū)域
JTextField jTextField=null;//可以允許用來(lái)編輯單行文本
JButton sendButton=null;
JPanel jPanel=null;
JScrollPane jScrollPane =null;
//把信息發(fā)給客戶端對(duì)象
PrintWriter printWriter =null;
/**
* 服務(wù)端的主函數(shù)
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyServer();
}
/**
* 服務(wù)端的構(gòu)造函數(shù),用來(lái)進(jìn)行初始化
* */
public MyServer(){
//這里是對(duì)GUI的初始化
jTextArea = new JTextArea();
jTextField= new JTextField(20);
sendButton= new JButton("發(fā)送");
sendButton.addActionListener(this);
sendButton.setActionCommand("send");
jScrollPane= new JScrollPane(jTextArea);
jPanel = new JPanel();
jPanel.add(jTextField);//添加編輯框
jPanel.add(sendButton);//添加按鈕
//將兩個(gè)面板添加布局
this.add(jScrollPane,BorderLayout.CENTER);
this.add(jPanel,BorderLayout.SOUTH);
this.setSize(400,300);
this.setTitle("聊天服務(wù)器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置退出按鈕
this.setVisible(true);
this.setResizable(true);
//下面是socket服務(wù)器的搭建
try {
//服務(wù)器監(jiān)聽
ServerSocket ss = new ServerSocket(9988);
//等待客戶端連接
Socket socket = ss.accept();
//獲得客戶端發(fā)送過來(lái)的數(shù)據(jù)的流
BufferedReader br = new BufferedReader
(new InputStreamReader(socket.getInputStream()));
printWriter = new PrintWriter(socket.getOutputStream(),true);
//讀取從客戶端發(fā)送過來(lái)的信息
while(true){
String info = br.readLine();
jTextArea.append("客戶端 "+getTime()+"\r\n"+info+"\r\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
/**
* 用來(lái)獲取當(dāng)前的時(shí)間
* @return 當(dāng)前的時(shí)間
*/
public String getTime(){
//可以對(duì)每個(gè)單獨(dú)時(shí)間域進(jìn)行修改
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);//獲取小時(shí)
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
return hour+":"+minute+":"+second;
}
/**
* 當(dāng)button被點(diǎn)擊的時(shí)候調(diào)用
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//當(dāng)按鈕按下的時(shí)候調(diào)用
if(e.getActionCommand().equals("send")){
//把服務(wù)器在jTextField寫的內(nèi)容發(fā)送給客戶端
String info= jTextField.getText();
jTextArea.append("服務(wù)器 "+getTime()+"\r\n"+info+"\r\n");
printWriter.println(info);
//清楚發(fā)送框內(nèi)容
jTextField.setText("");
}
}
}
客戶端
package qiu;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 簡(jiǎn)單聊天軟件的客戶端
* */
public class MyClient extends JFrame implements ActionListener{
JTextArea jTextArea=null;
JTextField jTextField=null;
JPanel jPanel=null;
JScrollPane jScrollPane=null;
JButton sendButton=null;
PrintWriter printWriter=null;
/**
* 客戶端的主函數(shù)
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyClient();
}
/**
* 客戶端構(gòu)造函數(shù)用來(lái)初始化
* */
public MyClient(){
//GUI初始化
jTextArea= new JTextArea();
jTextField=new JTextField(20);
sendButton= new JButton("發(fā)送");
sendButton.addActionListener(this);
sendButton.setActionCommand("send");
jScrollPane=new JScrollPane(jTextArea);
jPanel=new JPanel();
jPanel.add(jTextField);
jPanel.add(sendButton);
this.add(jScrollPane,BorderLayout.CENTER);
this.add(jPanel,BorderLayout.SOUTH);
this.setSize(400, 300);
this.setTitle("聊天客戶端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(true);
//socket通信代碼
try {
Socket s= new Socket("127.0.0.1",9988);
BufferedReader br = new BufferedReader
(new InputStreamReader(s.getInputStream()));
printWriter= new PrintWriter(s.getOutputStream(),true);
while(true){
//不停的讀取服務(wù)器發(fā)過來(lái)的信息
String string=br.readLine();
jTextArea.append("服務(wù)器 "+getTime()+"\r\n"+string+"\r\n");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 用來(lái)獲取當(dāng)前的時(shí)間
* @return 當(dāng)前的時(shí)間
*/
public String getTime(){
//可以對(duì)每個(gè)單獨(dú)時(shí)間域進(jìn)行修改
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);//獲取小時(shí)
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
return hour+":"+minute+":"+second;
}
/**
* 當(dāng)button被點(diǎn)擊的時(shí)候調(diào)用
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(sendButton.getActionCommand().equals("send")){
String info= jTextField.getText();
//將客戶端發(fā)送的信息發(fā)送給服務(wù)端
jTextArea.append("客戶端 "+getTime()+"\r\n"+info+"\r\n");
printWriter.println(info);
jTextField.setText("");
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題
本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-03-03
java實(shí)現(xiàn)表格數(shù)據(jù)的存儲(chǔ)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)表格數(shù)據(jù)的存儲(chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Springboot在有鎖的情況下正確使用事務(wù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot在有鎖的情況下如何正確使用事務(wù),今天通過一個(gè)實(shí)驗(yàn)給大家分析一下商品超賣問題,模擬場(chǎng)景分析通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
java基礎(chǔ)(System.err和System.out)詳解
下面小編就為大家?guī)?lái)一篇java基礎(chǔ)(System.err和System.out)詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-06-06
使用GenericObjectPool避免泄漏設(shè)置方法
這篇文章主要為大家介紹了使用GenericObjectPool避免泄漏的設(shè)置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
java模擬ajax訪問另一個(gè)項(xiàng)目的controller代碼實(shí)例
今天小編就為大家分享一篇關(guān)于java模擬ajax訪問另一個(gè)項(xiàng)目的controller代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
jvm細(xì)節(jié)探索之synchronized及實(shí)現(xiàn)問題分析
這篇文章主要介紹了jvm細(xì)節(jié)探索之synchronized及實(shí)現(xiàn)問題分析,涉及synchronized的字節(jié)碼表示,JVM中鎖的優(yōu)化,對(duì)象頭的介紹等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11

