日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Java线程】简单实现带界面的一对一聊天

發(fā)布時(shí)間:2024/4/14 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java线程】简单实现带界面的一对一聊天 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)現(xiàn)原理:

1、構(gòu)建好窗體,在窗體中創(chuàng)建好相應(yīng)的布局和控件;
2、為相應(yīng)的控件(按鈕:監(jiān)聽、連接、發(fā)送)添加事件;
3、使用到兩個(gè)線程:

a、監(jiān)聽線程:獲取服務(wù)器端輸入的端口號(hào),構(gòu)建socket,監(jiān)聽相應(yīng)端口,等待客戶端來連接; b、堅(jiān)守網(wǎng)絡(luò)陣地的線程:從網(wǎng)路中獲取信息,并將其寫出到屏幕;

源碼如下:

JFrameTcp.java

/*** @author lmb* 實(shí)現(xiàn)帶界面的一對(duì)一聊天*/ public class JFrameTcp extends JFrame implements ActionListener{private JTextField ipText;private JTextField portText;private JButton listen;private JButton connect;private TextArea msg;private JButton send;private JTextField c;private Socket skt;public JFrameTcp(){//構(gòu)造方法,初始化窗體中的組件this.setBounds(100,100,500,400);//設(shè)置窗體大小Container cc=this.getContentPane();//構(gòu)建容器cc.setLayout(new BorderLayout());//設(shè)置容器cc的布局//上Panel p1=new Panel();JLable ip=new JLable("IP:");//構(gòu)建IP標(biāo)簽p1.add(ip);//將其加入到p1容器中ipText=new JTextField(13);//構(gòu)建ip后的輸入框p1.add(ipText);//將其加入到p1容器中JLable port=new JLable("Port:");//構(gòu)建port標(biāo)簽p1.add(port);//將其加入到p1容器中portText=new JTextField(6);//構(gòu)建port后的輸入框p1.add(portText);//將其加入到p1容器中listen=new JButton("監(jiān)聽");//構(gòu)建監(jiān)聽按鈕p1.add(listen);//將其加入到p1容器中connect=new JButton("連接");//構(gòu)建連接按鈕p1.add(connect);//將其加入到p1容器中cc.add(p1,BorderLayout.NORTH);//將容器p1加入到容器cc的上邊//中Panel p2=new Panel();p2.setLayout(new BorderLayout());//設(shè)置p2的布局方式msg=new TextArea();//構(gòu)建消息顯示框p2.add(msg,BorderLayout.CENTER);//將消息顯示框添加到p2的中間cc.add(p2,BorderLayout.CENTER);//將容器p1加入到容器cc的中間//下Panel p3=new Panel();p3.setLayout(new BorderLayout());//為容器p3設(shè)置一個(gè)布局方式sendText=new JTextField(20);//構(gòu)建send前的輸入框p3.add(sendText,BorderLayout.CENTER);//將其加入到p3容器的中間send=new JButton("發(fā)送");//構(gòu)建發(fā)送按鈕p3.add(send,BorderLayout.EAST);//將其加入到p3容器的右邊cc.add(p3,BorderLayout.SOUTH);//將容器p1加入到容器cc的下邊//給按鈕添加事件listen.addActionListener(this);connect.addActionListener(this);send.addActionListener(this);}//事件方法public void actionPerformed(ActionEvent e){if (e.getSource() == listen) {doListen();//服務(wù)器端調(diào)用該方法,監(jiān)聽端口,等待客戶端來連接}if (e.getSource() == connect) {doConnect();//客戶端調(diào)用該方法,向服務(wù)器端發(fā)起連接} if (e.getSource() == send) {doSend();//發(fā)送消息} } //發(fā)送消息private void doSend() {String s=sendText.getText();//獲取發(fā)送框中的信息try {//構(gòu)建輸出流,將從發(fā)送框獲取的信息寫入到網(wǎng)絡(luò)PrintWriter pw=new PrintWriter(skt.getOutputStream());pw.println(s);pw.flush();sendText.setText("");//每次點(diǎn)擊發(fā)送之后將文本框置空} catch (Exception e) {e.printStackTrace();}}//連接private void doConnect() {try {skt=new Socket(ipText.getText(), Integer.parseInt(portText.getText()));new Net().start();//啟動(dòng)一個(gè)線程來堅(jiān)守網(wǎng)絡(luò)} catch (Exception e) {e.printStackTrace();}}//監(jiān)聽private void doListen() {//為什么要使用線程:監(jiān)聽的時(shí)候會(huì)發(fā)生阻塞,使用線程來避免阻塞new ListenThread().start();//在線程中實(shí)施監(jiān)聽new Net().start();//啟動(dòng)一個(gè)線程來堅(jiān)守網(wǎng)絡(luò)}/*** 監(jiān)聽線程(內(nèi)部類)* 使用內(nèi)部類的原因:在該線程中要使用portText、appendMsg兩個(gè)變量,我們可以在開啟線程的時(shí)候使用構(gòu)造方法* 將這兩個(gè)變量傳進(jìn)來,但是如果我們?cè)诰€程中要用到的變量比較多,這時(shí)候再用構(gòu)造方法來傳變量就相當(dāng)麻煩了,* 于是,我們可以使用內(nèi)部類來達(dá)到直接使用外部類成員變量的目的。**/class ListenThread extends Thread{public void run(){String s=portText.getText();//獲取portText中輸入的端口號(hào)ServerSocket sskt=null;try {sskt=new ServerSocket(Integer.parseInt(s));//當(dāng)開始監(jiān)聽時(shí)給出提示信息appendMsg.append("監(jiān)聽中……\n");skt=sskt.accept();//等待其他人來連接appendMsg.append(skt.getInetAddress().getHostAddress() + "與我建立連接\n");} catch (Exception e) {e.printStackTrace();}}}//用來堅(jiān)守網(wǎng)絡(luò)陣營,然后將從網(wǎng)絡(luò)中獲取的信息寫出到屏幕class Net extends Thread{public void run(){try {BufferedReader br=new BufferedReader(new InputStreamReader(skt.getInputStream()));for (;;) {appendMsg.append(skt.getInetAddress().getHostAddress() + ":" + br.readLine() + "\n");}} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {new JFrameTcp().setVisible(true);//設(shè)置窗體可見}}

運(yùn)行效果:

該例只是簡(jiǎn)單實(shí)現(xiàn)了一下一對(duì)一聊天的主要功能,其中還有好多問題沒有解決,不如:在沒有輸入端口號(hào)和IP地址的情況下直接發(fā)送消息,也是可以發(fā)送的,等等,邊學(xué)邊改進(jìn),努力做到更好,后續(xù)會(huì)有更好的實(shí)現(xiàn)!

總結(jié)

以上是生活随笔為你收集整理的【Java线程】简单实现带界面的一对一聊天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。