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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

socket通信 _ 一个简单的群聊系统

發布時間:2024/9/5 windows 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket通信 _ 一个简单的群聊系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

群聊系統要用到通信socket協議,在java中要用到兩個類java.net.ServerSocket和

Java.net.Socket.ServerSocket用于創建服務器,而Socket用于創建連接。

簡單介紹Socket通信的用法

首先,我們建立一個簡單的 “服務器—客戶端”一對一的連接來說明如何用socket通信。

1.建立一個服務器ServerSocket? server=new ServerSocket(port);

Port是一個整形數據,表示端口號,端口的范圍是0~65534,而0~1024端口是系統預留端口,為避免端口被占用我們可以選擇一個較大的數:int port=9900;

2.建立一個鏈接來連接服務器和客戶端。

服務器:Socket socket_server=server.accept();這是一個死等函數,若沒有成功建立連接,則程序不會向下執行。

客戶端:Socket socket_client=new Socket(IPaddr,port);IPaddr表示你的網絡IP地址,本系統在本機上運行可以用127.0.0.1代替,否則可以在命令行下輸入ipconfig進行查找。Port為服務器建立的端口號。

3.完成這些以后我們就可以進行服務器和客戶端之間的通信了。

發消息需要用到java.io.DataInputStream和java.io.DataOutputStream。

?在發送端:DataOutputStream dout=new DataOutputStream(socket_sever.getoutputString);

?????????????? dout.writeUTF(massage);

?接收端:DateInputStream din=new DateInputStream(socket_client.getInputStream);

?????????????? String accept=din.readUTF();

這樣,服務器端和客戶端就可以進行簡單的通信了。當然,若想時時刻刻都能接收到信息,則必須把接受代碼放入線程中讓其循環執行。

?

群聊系統的設計:

服務器:

功能描述:創建一個服務器,接收來自客戶端的消息,并分發給每個客戶端。

1.建立服務器

public void BuildServer() {try {int port=9900;server = new ServerSocket(port);System.out.println("創建群聊服務器成功!");InetAddress addr=InetAddress.getLocalHost();System.out.println("本機地址:"+addr); //將網絡地址和端口打印方便客戶端進行連接System.out.println("端口號:"+port);} catch (IOException e) {e.printStackTrace();}}

2.創建socket,由于客戶端不止一個,故socket也不只一個,我們可以將Socket=server.accept();循環執行。

@Override //這是重寫Thread類中的run();public void run() {while (true) {try {Socket socket = server.accept();
//鏈接建立后,接收客戶端傳來的用戶名信息DataInputStream in
= new DataInputStream(socket.getInputStream());String name=in.readUTF();if (name.equals(""))name="匿名用戶";System.out.println(name + "已成功連接!");try {DataOutputStream out = new DataOutputStream(socket.getOutputStream());out.writeUTF(("親愛的"+name+",你已連接到服務器!\n\r"));} catch (IOException e) {e.printStackTrace();}
//這是一個線程類,之后將會創建,用于與客戶端收發消息GroupThread gt
= new GroupThread(socket, list, name);
//list是一個鏈表,存儲每個已存在的連接,其初始化:ArrayList<GroupThread> list = new ArrayList<GroupThread>();list.add(gt);gt.start();}
catch (IOException e) {}}

3.主函數

public class GroupServer extends Thread {/*** @param 群聊服務器*/ServerSocket server;ArrayList<GroupThread> list = new ArrayList<GroupThread>();public void BuildServer() {}@Overridepublic void run() {}public static void main(String[] args) {GroupServer s = new GroupServer();s.BuildServer();s.start();}}

?

4.GroupThread類,用于服務器與客戶端的收發信息,收到來自客戶端的信息后分發出去。

public class GroupThread extends Thread{Socket socket;String str;String accept;ArrayList<GroupThread> list;private String username;public GroupThread(Socket socket, ArrayList<GroupThread> list,String name){this.socket=socket;this.list=list;this.username=name;}@SuppressWarnings("deprecation") public void run(){while (true) {try {DataInputStream in = new DataInputStream(socket.getInputStream());accept=in.readUTF();if(!accept.equals("")){sendGroup();}} catch (IOException e) {try {
//客戶端關閉后斷開連接,將這個鏈接從鏈表中移除,并停止線程System.out.println(username
+"已斷開連接!");list.remove(list.indexOf(this));this.stop();socket.close();} catch (IOException e1) {System.out.println("斷開連接出現異常!");}}} }private void sendGroup() {int index=list.indexOf(this);for(int i=0;i<list.size();i++){if(index!=i){list.get(i).Send(accept);}}
public void Send(String str){
?? ??? ?try {
?? ??? ??? ?DataOutputStream out = new DataOutputStream(
?? ??? ??? ??? ??? ?socket.getOutputStream());
?? ??? ??? ?out.writeUTF(str);
?? ??? ?} catch (IOException e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ?} }

?客戶端:

1.登陸界面,提取登錄名(未做驗證),用于顯示群聊過程中的昵稱

public class Login extends JFrame {private static final long serialVersionUID = 1L;private JTextField name = new JTextField(9);private JButton login = new JButton("登錄");public void showUI() {this.setTitle("請輸入你的用戶名");this.setSize(300, 240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLocationRelativeTo(null);this.setLayout(new FlowLayout());this.setResizable(false);this.add(new JLabel("用戶名:"));this.add(name);Listener listener=new Listener(this,name);name.addKeyListener(listener);this.add(login);login.setFocusable(false);login.addActionListener(listener);this.setVisible(true);}public static void main(String[] args) {new Login().showUI();} }class Listener implements KeyListener,ActionListener{Login login;JTextField jt;private String name;public Listener(Login login,JTextField jt){this.jt=jt;this.login=login;}@Overridepublic void actionPerformed(ActionEvent e) {name=jt.getText();MyChat chat=new MyChat(name);try {chat.runit();} catch (IOException e1) {e1.printStackTrace();}login.setVisible(false);}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {if(e.getKeyCode()==10){name=jt.getText();MyChat chat=new MyChat(name);try {chat.runit();} catch (IOException e1) {e1.printStackTrace();}login.setVisible(false);}}}

2.聊天界面

public class MyChat extends Thread {JButton send = new JButton("發送");JTextField jt = new JTextField(20);JTextArea jta = new JTextArea();DataOutputStream out;Socket socket;String str;byte secret=19;String name;ServerSocket server;JFrame thiss = new JFrame();public MyChat(String name){this.name=name;}public void client() throws IOException {thiss.setSize(400, 300);thiss.setLayout(new BorderLayout());thiss.setDefaultCloseOperation(3);thiss.setLocationRelativeTo(null);JScrollPane js = new JScrollPane(jta);thiss.getContentPane().add(js);thiss.setResizable(false);JPanel south = new JPanel();thiss.add(south, BorderLayout.SOUTH);south.add(jt);send.setFocusable(false);jta.setFocusable(false);jt.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if (KeyEvent.getKeyText(e.getKeyCode()).equals("Enter")) {str = jt.getText() + "\n\r";jt.setText("");jta.append(name +":" + str);try {out = new DataOutputStream(socket.getOutputStream());out.writeUTF(name +":" + str);} catch (IOException e1) {}};}});send.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent actionEvent) {str = jt.getText() + "\n\r";jt.setText("");jta.append(name+":" + str);try {out = new DataOutputStream(socket.getOutputStream());out.writeUTF((name + ":" + str));} catch (IOException e) {}}});south.add(send);thiss.setVisible(true);}@SuppressWarnings("deprecation")public void run() {while (true) {try {DataInputStream in = new DataInputStream(socket.getInputStream());String accept = in.readUTF();if(!accept.equals(""))jta.append(accept);} catch (IOException e) {try {System.out.println("連接已斷開!");socket.close();this.stop();} catch (IOException e1) {e1.printStackTrace();}} }}public void connect() {try {String addr="127.0.0.1";//本機地址socket = new Socket(addr, 9900);out = new DataOutputStream(socket.getOutputStream());out.writeUTF(name);thiss.setTitle(name);} catch (IOException e) {}}public void runit() throws IOException{this.client();this.connect();this.start();if(name.equals("")){name="匿名";thiss.setTitle("匿名");}} }

運行結果:

轉載于:https://www.cnblogs.com/xiao-v/p/4673457.html

總結

以上是生活随笔為你收集整理的socket通信 _ 一个简单的群聊系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。