Java用socket实现简单的一对一通信

来源:互联网 发布:fft算法 c语言 编辑:程序博客网 时间:2024/05/19 02:00

本人也是一个初涉及编程的小白,今天尝试用socket编写一个类似与QQ的聊天窗口,分为客户端和服务器端,然后通过socket来通讯,废话不多说直接上代码:

首先是客户端:


Client.java


package myQQ;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.Socket;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import java.awt.*;public class Client extends JFrame implements Runnable, ActionListener{private JTextArea chatArea;private JTextField iptextField,porttextField,messageField;private JButton connectionButton,sendButton;private Socket socket;private DataInputStream in;private DataOutputStream out;private Thread thread;private JComboBox namecomboBox;public Client(){createUserInterface();setTitle("客服端");setSize(550,500);setResizable(false);setLocationRelativeTo(null);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void createUserInterface(){setLayout(new FlowLayout());add(new JLabel("主机"));iptextField=new JTextField(10);add(iptextField);add(new JLabel("端口"));porttextField=new JTextField(10);add(porttextField);add(new JLabel("使用人"));namecomboBox=new JComboBox();namecomboBox.addItem("郑云红");namecomboBox.addItem("尤晓英");add(namecomboBox);connectionButton=new JButton("连接");add(connectionButton);chatArea=new JTextArea(8,44);add(new JScrollPane(chatArea));messageField=new JTextField(20);add(messageField);sendButton=new JButton("发送");add(sendButton);connectionButton.addActionListener(this);sendButton.addActionListener(this);socket=new Socket();thread=new Thread(this);}public void connect(){try{if(!socket.isConnected()){InetAddress address=InetAddress.getByName(iptextField.getText());InetSocketAddress socketAddress=new InetSocketAddress(address, Integer.parseInt(porttextField.getText()));socket.connect(socketAddress);in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());sendButton.setEnabled(true);if(!thread.isAlive()){thread=new Thread(this);}thread.start();}}catch(Exception e){System.out.println(e);socket=new Socket();}}public void send(){String msg=messageField.getText().trim();if(msg.isEmpty()){JOptionPane.showMessageDialog(this, "请输入发送信息:");return;}chatArea.append(namecomboBox.getSelectedItem()+":"+msg+"\n");try{out.writeUTF(namecomboBox.getSelectedItem()+":"+msg);messageField.setText("");}catch(Exception e){e.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==sendButton){send();}else if(e.getSource()==connectionButton){connect();}}@Overridepublic void run() {if(Thread.currentThread()==thread){String msg=null;while(true){try{msg=in.readUTF();chatArea.append("服务器:"+msg+"\n");}catch(IOException e){e.printStackTrace();socket=new Socket();break;}}}}    public static void main(String[] args){    EventQueue.invokeLater(new Runnable(){    public void run(){    try{    Client frame=new Client();    frame.setVisible(true);    }catch(Exception e){    e.printStackTrace();    }    }    });    }}

client执行的效果如下图:


然后是服务器端:


Server.java

package myQQ;import java.awt.EventQueue;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class Server extends JFrame implements Runnable,ActionListener{private JTextArea chatArea;private JTextField porttextField,messageField;private JButton startButton,sendButton;private ServerSocket serversocket;private Socket socket;private DataInputStream in;private DataOutputStream out;private Thread thread;public Server(){createUserInterface();setTitle("服务器");setSize(550,500);setResizable(false);setLocationRelativeTo(null);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void createUserInterface(){setLayout(new FlowLayout());add(new JLabel("端口"));porttextField=new JTextField(22);add(porttextField);add(new JLabel("启动"));startButton=new JButton("启动");add(startButton);chatArea=new JTextArea(8,40);add(new JScrollPane(chatArea));messageField=new JTextField(20);add(messageField);sendButton=new JButton("发送");add(sendButton);startButton.addActionListener(this);sendButton.addActionListener(this);thread=new Thread(this);}public void connect(){try{chatArea.append("请稍等...\n");serversocket=new ServerSocket(Integer.parseInt(porttextField.getText()));socket=serversocket.accept();chatArea.append("连接成功...\n");in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());if(!thread.isAlive()){thread=new Thread(this);}thread.start();}catch(Exception e){System.out.println(e);try{serversocket=new ServerSocket();}catch(IOException e1){e1.printStackTrace();}}}public void send(){String msg=messageField.getText().trim();if(msg.isEmpty()){JOptionPane.showMessageDialog(this, "请输入发送信息:");return;}chatArea.append("服务器:"+msg+"\n");try{out.writeUTF(msg);messageField.setText("");}catch(Exception e){e.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getSource()==sendButton){send();}else if(e.getSource()==startButton){connect();}}@Overridepublic void run() {if(Thread.currentThread()==thread){String msg=null;while(true){try{msg=in.readUTF();chatArea.append(msg+"\n");}catch(IOException e){e.printStackTrace();try{serversocket=new ServerSocket();}catch(IOException e1){e1.printStackTrace();}}break;}}} public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){    public void run(){    try{    Server frame=new Server();    frame.setVisible(true);    }catch(Exception e){    e.printStackTrace();    }    }    });    }}


然后同时执行client和server就可以得到下面的结果:






注意: 在点击启动的时候,你观察到的程序可能没有反应,但这个时候服务器是已经打开了的,这个时候只需要在客户端输入端口就能够匹配了,所以先不要慌。

原创粉丝点击