欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java如何實(shí)現(xiàn)基于Tcp的socket聊天程序

這篇文章主要介紹了java如何實(shí)現(xiàn)基于Tcp的socket聊天程序,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計(jì)品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

對(duì)于步入編程行業(yè)不深的初學(xué)者或是已經(jīng)有所領(lǐng)會(huì)的人來(lái)說(shuō),當(dāng)學(xué)習(xí)一項(xiàng)新的技術(shù)的時(shí)候,非??释幸粋€(gè)附上注釋完整的Demo。本人深有體會(huì),網(wǎng)上的例子多到是很多,但是很雜不完整,寫代碼這種東西來(lái)不得半點(diǎn)馬虎,要是錯(cuò)了一點(diǎn),那也是運(yùn)行不了的。這對(duì)于初學(xué)者來(lái)說(shuō)更加的頭疼,因?yàn)樗静恢厘e(cuò)在哪里,盲目的改只能錯(cuò)上加錯(cuò)。最后不得不去找找看看有沒(méi)有能夠直接運(yùn)行的例子再加以模仿。

下面是博主在學(xué)習(xí)Java的socket時(shí)寫的一個(gè)完整的例子,并且?guī)狭送暾淖⑨尅K且粋€(gè)簡(jiǎn)單的聊天程序,但是它可以設(shè)置任意多用戶同時(shí)登錄,然后相互兩兩交流。博主僅僅在自己電腦上實(shí)現(xiàn)同時(shí)登錄,然后兩兩相互交流。

程序的大體思路是這樣的:

①該用戶作為服務(wù)端也就是被請(qǐng)求連接端和主動(dòng)請(qǐng)求連接其他端時(shí)不一樣的,其次有可能被其他的用戶連接很多次,那么你作為服務(wù)端,就會(huì)有很多連接,同樣的道理,你作為客戶端也會(huì)有很多的連接。為了程序更加通俗易懂,博主寫的時(shí)候,設(shè)置了很多容器,將不一樣的東西分開(kāi)放置。做到解耦合,不然到后面自己都分不清了。

②你可以一次寫兩個(gè)類,client1,client2,,client1先作為服務(wù)端,client2作為客戶端,客戶端去連接服務(wù)端,從而實(shí)現(xiàn)client1的服務(wù)端功能和client2的客戶端功能。每次實(shí)現(xiàn)一個(gè)功能就先將服務(wù)端和客戶端的功能整合一下,互換角色,看是否存在錯(cuò)誤。

③在實(shí)現(xiàn)了兩個(gè)用戶的情況下再去寫第三個(gè)類client3,代碼就是復(fù)制粘貼。當(dāng)然你也可以直接創(chuàng)建一個(gè)client3的類,然后直接在類的main方法中改了端口號(hào),和用戶名就行。第三個(gè)實(shí)現(xiàn)后,第四個(gè)第五個(gè)也就實(shí)了。

下面是具體的代碼:

package jack;
 
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.time.format.TextStyle;
import java.util.ArrayList;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.plaf.basic.BasicTabbedPaneUI.TabbedPaneLayout;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter.DEFAULT;
 
import org.omg.CORBA.PRIVATE_MEMBER;
/**
 * 被請(qǐng)求連接時(shí)稱為服務(wù)器;主動(dòng)連接對(duì)方時(shí)稱為客戶端。
 * @author Administrator
 *
 */
public class Client4 extends JFrame implements ActionListener{
 
 private static int sign = 0;    //用來(lái)記錄選項(xiàng)卡的標(biāo)簽,0標(biāo)示第一個(gè)。
 private JToolBar toolBar1,toolBar2;
 private JLabel waitPortLabel,hostLabel,portLabel;
 private JTextField waitPortTF,hostTF,portTF,sendTF;
 private JTabbedPane tab;
 private JButton sendB,leaveB,deleteB,connB;
 private ArrayList<ChatThread> serverThreads; //存放服務(wù)器線程的容器。即存放被請(qǐng)求連接時(shí)所創(chuàng)建的線程的容器。
 private ArrayList<ChatThread> clientThreads; //存放客戶端線程的容器。即存放主動(dòng)連接對(duì)方時(shí)所創(chuàng)建的線程的容器。
 private ArrayList<ServerSocket> servers;  //服務(wù)對(duì)象的容器。
 private ArrayList<MyJTextArea> serverTextAreas; //作為服務(wù)器時(shí),存放所創(chuàng)建的對(duì)話記錄顯示區(qū)域的容器。
 private ArrayList<MyJTextArea> clientTextAreas; //作為客戶端時(shí),岑芳所創(chuàng)建的對(duì)話記錄顯示區(qū)域的容器。
 private ArrayList<Socket> serverSockets;  //存放被請(qǐng)求連接時(shí)所創(chuàng)建的socket的容器。
 private ArrayList<Socket> clientSockets; //存放主動(dòng)請(qǐng)求連接時(shí)所創(chuàng)立的socket的容器。
 private ArrayList<PrintWriter> serverPWriters;  //存放服務(wù)端輸出流對(duì)象的容器。
 private ArrayList<BufferedReader> serverBReaders; //存放服務(wù)端輸入流對(duì)象的容器。
 private ArrayList<PrintWriter> clientPWriters;  //存放客戶端輸出流對(duì)象的容器。
 private ArrayList<BufferedReader> clientBReaders; //存放客戶端輸入流對(duì)象的容器。
 private ArrayList<Integer> ports;  //存放作為服務(wù)器時(shí)已連接的端口。
 private int port = 2041; //指定自己開(kāi)放的第一個(gè)端口號(hào),方便其他人連接。
 private String name;     //儲(chǔ)存自己的名稱。
 
 public Client4(String name) throws IOException{
 super(name);
 this.name = name;     
 toolBar1 = new JToolBar();
 toolBar2 = new JToolBar();
 waitPortLabel = new JLabel("等待端口");
 hostLabel = new JLabel("主機(jī)");
 portLabel = new JLabel("端口");
 waitPortTF = new JTextField("2041");
 hostTF = new JTextField("127.0.0.1");
 portTF = new JTextField(5);
 sendTF = new JTextField();
 tab = new JTabbedPane();
 sendB = new JButton("發(fā)送");
 leaveB = new JButton("離線");
 deleteB = new JButton("刪除頁(yè)");
 connB = new JButton("連接端口");
 
 servers = new ArrayList<ServerSocket>();
 serverTextAreas = new ArrayList<MyJTextArea>();
 clientTextAreas = new ArrayList<MyJTextArea>();
 serverSockets = new ArrayList<Socket>();
 clientSockets = new ArrayList<Socket>();
 serverPWriters = new ArrayList<PrintWriter>();
 serverBReaders = new ArrayList<BufferedReader>();
 clientPWriters = new ArrayList<PrintWriter>();
 clientBReaders = new ArrayList<BufferedReader>();
 serverThreads = new ArrayList<ChatThread>();
 clientThreads = new ArrayList<ChatThread>();
 ports = new ArrayList<Integer>();
 
 toolBar1.add(waitPortLabel);
 toolBar1.add(waitPortTF);
 toolBar1.add(hostLabel);
 toolBar1.add(hostTF);
 toolBar1.add(portLabel);
 toolBar1.add(portTF);
 toolBar1.add(connB);
 
 toolBar2.add(sendTF);
 toolBar2.add(sendB);
 toolBar2.add(leaveB);
 toolBar2.add(deleteB);
 
 waitPortTF.setEnabled(false);   //設(shè)置等待的textfield不可以編輯。
 hostTF.setEnabled(false); //設(shè)置連接的ip地址不可編輯,當(dāng)然這里可以更改成其他電腦的ip地址。
 this.getContentPane().add(toolBar1, "North"); //添加工具欄到最上方。
 this.getContentPane().add(tab,"Center"); //添加選項(xiàng)卡窗格。
 this.getContentPane().add(toolBar2,"South"); //添加工具欄到下方。
 
 this.setBounds(200, 200, 350, 300);
 this.setVisible(true);
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
 sendB.addActionListener(this);
 leaveB.addActionListener(this);
 deleteB.addActionListener(this);
 connB.addActionListener(this);
 
 //主線程進(jìn)入之后 在server.accept()阻塞等待客戶端來(lái)連接。
 while(true){
 ServerSocket server = new ServerSocket(port); //作為服務(wù)器,開(kāi)發(fā)自己供連接的端口。
 servers.add(server);  
 Socket serverSocket = server.accept();  //等待對(duì)方連接。
 serverSockets.add(serverSocket);
 ports.add(port);   //將已連接的端口加入容器。
 PrintWriter serverPWriter = new PrintWriter(serverSocket.getOutputStream(),true);//初始化輸出流對(duì)象。
 serverPWriters.add(serverPWriter);
 BufferedReader serverBReader = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));//初始化輸入流對(duì)象。
 serverBReaders.add(serverBReader);
 serverPWriter.println("連接"+name+"成功");  //將連接成功的消息發(fā)送給請(qǐng)求方,提醒對(duì)方連接成功。
 serverPWriter.println(name);  //將自己的名稱發(fā)送給對(duì)方,方便對(duì)方設(shè)置選項(xiàng)卡的名稱。
 String content = serverBReader.readLine();  //此時(shí)對(duì)方也發(fā)送了上面兩條消息過(guò)來(lái)。讀入對(duì)方發(fā)送過(guò)來(lái)的提醒消息。
 String name2 = serverBReader.readLine(); //讀取對(duì)方的名稱。方便后面設(shè)置選項(xiàng)卡的名稱。
 System.out.println(content);
 System.out.println(name2);
 MyJTextArea serverTextArea = new MyJTextArea(sign); 
 sign++;      //new了一個(gè)textArea后,sign自動(dòng)增加1,好和選項(xiàng)卡對(duì)應(yīng),
       //知道這個(gè)選項(xiàng)卡加到哪個(gè)容器了,是服務(wù)器的還是客戶端的。
 serverTextAreas.add(serverTextArea);
 this.tab.addTab(name2,new JScrollPane(serverTextArea));//在選項(xiàng)卡窗格中添加一個(gè)選項(xiàng)卡。
 serverTextArea.setEditable(false); //設(shè)置對(duì)話記錄顯示區(qū)域不可編輯。
 serverTextArea.setLineWrap(true); //設(shè)置對(duì)話記錄顯示區(qū)域自動(dòng)換行。
 serverTextArea.append(content+"\n"); //在對(duì)話記錄區(qū)域輸出連接成功這條消息。
 ChatThread thread = new ChatThread(); //new了一個(gè)線程去執(zhí)行run方法,用于和對(duì)方交流,對(duì)方也會(huì)開(kāi)啟一個(gè)線程來(lái)和你交流。
  //這里要開(kāi)啟新線程的原因是main線程經(jīng)過(guò)一輪后會(huì)在上面accept方法處阻塞。
 serverThreads.add(thread);
 thread.start();     //啟動(dòng)該線程,方便接收對(duì)方發(fā)來(lái)的消息。
 port++;  //端口號(hào)加一,開(kāi)放下一個(gè)供連接的端口。
 waitPortTF.setText(port+"");   //更新顯示等待的下個(gè)端口。
 }
 }
 
 private class ChatThread extends Thread {
 
 private String[] serverContents = new String[10]; //當(dāng)作為服務(wù)端時(shí),用來(lái)存放相互發(fā)送消息時(shí)的一句話。
 private String[] clientContents = new String[10]; //當(dāng)作為客戶端時(shí),用來(lái)存放相互發(fā)送消息時(shí)的一句話。
 private boolean isServerThread = true;  //判斷當(dāng)前在執(zhí)行run方法的線程是不是服務(wù)端線程。
 
 @Override
 public void run() {
 
 while(true){
 if(serverThreads.size()>0){ //判斷當(dāng)前的線程是否是服務(wù)線程。先判斷是否大于0,是為了防止serverThreads 
 for(int i=0;i<serverThreads.size();i++){ //報(bào)數(shù)組越界。
 if(Thread.currentThread() == serverThreads.get(i)){ //拿當(dāng)前線程和服務(wù)端容器里的線程去比,看是否是服務(wù)端的線程。
 isServerThread = true;
 }
 }
 }
 
 if(clientThreads.size()>0){   //判斷當(dāng)前的線程是否是客戶線程。 先判斷是否大于0,是為了防止clientThreads
 for(int i=0;i<clientThreads.size();i++){ //報(bào)數(shù)組越界。
 if(Thread.currentThread() == clientThreads.get(i)){ //拿當(dāng)前線程和客戶端容器里的線程去比,看是否是客戶端的線程。
 isServerThread = false;
 }
 }
 }
 
 if(isServerThread){   //如果是服務(wù)端的線程,將readline方法接受到的值賦給相應(yīng)的content。
 for(int i=0;i<serverThreads.size();i++){
 if(Thread.currentThread() == serverThreads.get(i)){ //判斷具體是服務(wù)端里的那條線程。
 try {
 serverContents[i] = serverBReaders.get(i).readLine();//將對(duì)方發(fā)送過(guò)來(lái)的消息賦值給這條線程的接受消息字符串。
 } catch (IOException e) {
 e.printStackTrace();
 return;  //出現(xiàn)異常時(shí)直接退出方法。
 }
 if(serverContents[i]==null){  //在自己點(diǎn)擊離線按鈕時(shí),serverContents[i]為null,
 return;  //因此在這里進(jìn)行處理,避免后面報(bào)錯(cuò)。 
 }
 if(serverContents[i].equals("關(guān)閉")){ //接收到對(duì)方因點(diǎn)擊離開(kāi)按鈕而發(fā)出的消息“離開(kāi)”,關(guān)閉自己的連接。
 sendTF.setText("已斷開(kāi)連接");
 serverPWriters.get(i).close();
 try {
  serverBReaders.get(i).close();
  serverSockets.get(i).close();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return;    //關(guān)閉完后退出。
 }
 serverTextAreas.get(i).append(serverContents[i]+"\n");//將接受到的消息顯示在自己的對(duì)話記錄區(qū)域。
 break;
 }
 
 }
 }else{    //如果是客戶線程,將readline方法接受到的值賦給相應(yīng)的content。
 for(int i=0;i<clientThreads.size();i++){ 
 if(Thread.currentThread() == clientThreads.get(i)){ //判斷具體是客戶端中的哪一條線程。
 try {
 clientContents[i] = clientBReaders.get(i).readLine();//拿到對(duì)方發(fā)送過(guò)來(lái)的消息并保存給自己的字符串。
 } catch (IOException e) {
 e.printStackTrace();
 }
 if(clientContents[i] == null){ //當(dāng)自己點(diǎn)擊離線按鈕時(shí),clientContents[i]會(huì)為null,
 return; //為了防止下面報(bào)錯(cuò),在這里進(jìn)行處理。 
 }
 if(clientContents[i].equals("關(guān)閉")){ //接收到對(duì)方因點(diǎn)擊離線按鈕而發(fā)出的消息“關(guān)閉”,而關(guān)閉自己的連接。
 sendTF.setText("已斷開(kāi)連接");
 clientPWriters.get(i).close();
 try {
  clientBReaders.get(i).close();
  clientSockets.get(i).close();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return;
 }
 clientTextAreas.get(i).append(clientContents[i]+"\n");//作為客戶端時(shí),將接受到的消息顯示在對(duì)話記錄顯示區(qū)域。
 break;
 }
 }
 }
 }
 }
 }
 
 @Override
 public void actionPerformed(ActionEvent e) {
 switch(e.getActionCommand()){
 case "連接端口":      //如果是連接端口,則執(zhí)行以下操作。
 try {
 Socket clientSocket = new Socket(hostTF.getText(),Integer.parseInt(portTF.getText()));//拿到工具欄一中填的端口號(hào)并生成socket去連接對(duì)方。
 clientSockets.add(clientSocket);
 PrintWriter clientPWriter = new PrintWriter(clientSocket.getOutputStream(),true);//初始化輸出流對(duì)象。
 clientPWriters.add(clientPWriter);
 BufferedReader clientBReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//初始化輸入流對(duì)象。
 clientBReaders.add(clientBReader);
 clientPWriter.println("連接"+name+"成功");  //將連接成功的消息發(fā)送給對(duì)方,提醒對(duì)方連接成功。
 clientPWriter.println(name); //將自己的名稱發(fā)送給對(duì)方,方便對(duì)方設(shè)置選項(xiàng)卡的名稱。
 System.out.println(11111111);
 String content = clientBReader.readLine(); //讀入對(duì)方發(fā)送過(guò)來(lái)的提醒消息。對(duì)方已執(zhí)行了上面兩條語(yǔ)句,發(fā)送了對(duì)應(yīng)的消息。
 System.out.println(22222222);
 String name2 = clientBReader.readLine(); //讀取對(duì)方的名稱。
 System.out.println(content);
 System.out.println(name2);
 MyJTextArea clientTextArea = new MyJTextArea(sign);
 sign++;  //配和選項(xiàng)卡的index,記錄每個(gè)選項(xiàng)卡加到那個(gè)容器里去了,是服務(wù)器的容器還是客戶端的容器。
 clientTextAreas.add(clientTextArea);
 this.tab.addTab(name2,new JScrollPane(clientTextArea)); //在選項(xiàng)卡窗格中添加一個(gè)選項(xiàng)卡。
 clientTextArea.setEditable(false);  //設(shè)置對(duì)話記錄區(qū)域不可編輯。
 clientTextArea.setLineWrap(true);  //設(shè)置對(duì)話記錄區(qū)域自動(dòng)換行。
 clientTextArea.append(content+"\n"); //在對(duì)話記錄區(qū)域顯示連接成功這條消息。
 ChatThread clientThread = new ChatThread();
 clientThreads.add(clientThread);
 clientThread.start();    //啟動(dòng)該線程,方便和對(duì)方相互發(fā)送消息,因?yàn)橹骶€程已經(jīng)在上面accept()處阻塞。
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 break;
 case "發(fā)送":
 if(serverTextAreas.size()>0){    //如果是被請(qǐng)求連接時(shí)而創(chuàng)建的選項(xiàng)卡要發(fā)送消息。即服務(wù)端。
 for(int i=0;i<serverTextAreas.size();i++){
 if(tab.getSelectedIndex() == serverTextAreas.get(i).getSign()){ //通過(guò)獲取當(dāng)前選項(xiàng)卡的index去和jtextArea的sign比,因?yàn)樗麄兊膇ndex和sign是匹配的,
 String sendContent = sendTF.getText(); //從而確定它是服務(wù)端的哪條線程,該用那對(duì)輸入輸出流進(jìn)行發(fā)送和接受消息。
 if(serverSockets.get(i).isClosed()){ //如果已斷開(kāi)連接,則直接返回。
 sendTF.setText("已斷開(kāi)連接");
 return;
 }
 if(sendContent.equals("")){  //如果發(fā)送的內(nèi)容為空則直接接結(jié)束。
 sendTF.setText("請(qǐng)輸入內(nèi)容");
 return;
 }else{
 serverPWriters.get(i).println(name+": "+sendContent); //將發(fā)送消息框中的消息發(fā)送出去,并在前面加上自己的姓名。
 serverTextAreas.get(i).append("我: "+sendContent+"\n");//在自己的對(duì)話記錄區(qū)域加上這句話。
 sendTF.setText("");     //將發(fā)送消息框中的數(shù)據(jù)清空。
 return;
 }
 
 }
 }
 }
 
 if(clientTextAreas.size()>0){    //如果是客戶端。
 for(int i=0;i<clientTextAreas.size();i++){
 if(tab.getSelectedIndex() == clientTextAreas.get(i).getSign()){ //通過(guò)獲取當(dāng)前選項(xiàng)卡的index去和jtextArea的sign比,因?yàn)樗麄兊膇ndex和sign是匹配的,
 String sendContent = sendTF.getText();   //從而確定它是客戶端的哪條線程,該用那對(duì)輸入輸出流進(jìn)行發(fā)送和接受消息。
 if(clientSockets.get(i).isClosed()){ //如果連接已斷開(kāi)則直接返回。
 sendTF.setText("已斷開(kāi)連接");
 return;
 }
 if(sendContent.equals("")){  //如果發(fā)送的內(nèi)容為空則直接接結(jié)束。
 sendTF.setText("請(qǐng)輸入內(nèi)容");
 return;
 }else{
 clientPWriters.get(i).println(name+": "+sendContent); //將發(fā)送消息框中的消息發(fā)送出去,并在前面加上自己的姓名。
 clientTextAreas.get(i).append("我: "+sendContent+"\n"); //在自己的對(duì)話記錄區(qū)域加上這句話
 sendTF.setText("");     //將發(fā)送消息框中的數(shù)據(jù)清空。
 return;
 }
 }
 }
 }
 
 break;
 case "離開(kāi)":
 if(serverTextAreas.size()>0){      //如果是服務(wù)端。
 for(int i=0;i<serverTextAreas.size();i++){
 if(tab.getSelectedIndex() == serverTextAreas.get(i).getSign()){ //更前面一樣的道理,判斷是服務(wù)端的那個(gè)選項(xiàng)卡需要閉關(guān)。
 serverPWriters.get(i).println("關(guān)閉");   //發(fā)送關(guān)閉消息,提醒對(duì)方也要關(guān)閉該socket連接。
 sendTF.setText("已斷開(kāi)連接");
 serverPWriters.get(i).close();
 try {
 serverBReaders.get(i).close();
 serverSockets.get(i).close();    
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 break;
 }
 }
 }
 
 if(clientTextAreas.size()>0){      //如果是客戶端。
 for(int i=0;i<clientTextAreas.size();i++){
 if(tab.getSelectedIndex() == clientTextAreas.get(i).getSign()){ //更前面一樣的道理,判斷是客戶端的那個(gè)選項(xiàng)卡需要閉關(guān)。
 clientPWriters.get(i).println("關(guān)閉");   //發(fā)送關(guān)閉消息,提醒對(duì)方也要關(guān)閉該socket連接。
 sendTF.setText("已斷開(kāi)連接");
 clientPWriters.get(i).close();
 try {
 clientBReaders.get(i).close();
 clientSockets.get(i).close();    
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 break;
 }
 }
 }
 break;
 case "刪除頁(yè)":
 if(serverTextAreas.size()>0){ //為了防止下面的serverTextAreas數(shù)組越界。
 for(int i=0;i<serverTextAreas.size();i++){
 if(tab.getSelectedIndex() == serverTextAreas.get(i).getSign()){ //跟上面一樣的道理,判斷當(dāng)前選項(xiàng)卡是屬于服務(wù)端還是客戶端。
 if(serverSockets.get(i).isClosed()){ //先判斷是否斷開(kāi)連接,否則不允許關(guān)閉。
 tab.remove(i);  //刪除當(dāng)前選項(xiàng)卡。
 }else{
 sendTF.setText("請(qǐng)先關(guān)閉當(dāng)前的連接");
 return;
 }
 }
 }
 }
 if(clientTextAreas.size()>0){ //為了防止下面的serverTextAreas數(shù)組越界。
 for(int i=0;i<clientTextAreas.size();i++){
 if(tab.getSelectedIndex() == clientTextAreas.get(i).getSign()){ //跟上面一樣的道理,判斷當(dāng)前選項(xiàng)卡是屬于服務(wù)端還是客戶端。
 if(clientSockets.get(i).isClosed()){ //先判斷是否斷開(kāi)連接,否則不允許關(guān)閉。
 tab.remove(i);   //刪除當(dāng)前選項(xiàng)卡。
 }else{
 sendTF.setText("請(qǐng)先關(guān)閉當(dāng)前的連接");
 return;
 }
 }
 }
 }
 break;
 default:
 break;
 }
 }
 
 public static void main(String[] args) throws IOException{
 new Client4("喜洋洋");
 }
}

效果圖:

java如何實(shí)現(xiàn)基于Tcp的socket聊天程序

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java如何實(shí)現(xiàn)基于Tcp的socket聊天程序”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

本文名稱:java如何實(shí)現(xiàn)基于Tcp的socket聊天程序
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article30/goopso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司定制網(wǎng)站、微信小程序App開(kāi)發(fā)、外貿(mào)建站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
97在线观看视频免费| av免费在线观看网页| 亚洲一区二区三区在线播| 亚洲三级成人一区在线| 午夜18禁毛片免费看| 91美女黑丝免费国产视频| 亚洲欧美日韩精品av| 久久精品一区二区日韩| 亚洲国产午夜精品不卡| 精品人妻av区天天看片| 全国最大成人免费视频| 亚洲av区一区二区三| 国产亚洲欧美精品在线观看| 清纯唯美校园春色亚洲激情| av真人青青小草一区二区欧美| 国产精品一区二区久久| 亚洲精品国产高清久久| 亚洲男人的天堂社区av| 欧美成人精品三级一二| 亚洲熟女av综合网五月| 亚洲一区二区三区有码| av天天堂网在线播放| 久久青青草原一区二区| 日本伦理三级在线观看| 国产在线精品不卡一区| 动漫美女视频在线看黄| 色婷婷激一区二区三区| 日本熟女俱乐部一区二区| 色男人天堂网在线视频| 九色视频在线观看91| 麻豆精品国产粉嫩av| 亚洲s码在线一区二区| 加勒比中文字幕日本道| 亚洲欧美国产另类综合| 国产成人一区二区二区三区| 福利视频一区二区视频| 国产原创中文剧情性感av| 亚洲精品成人久久网| 日韩区一区二在线视频| 日本人妻中文字幕在线一区| 三级久久三级久久三级|