现在的位置: 首页 > 综合 > 正文

java tcp点对点聊天程序(单人/多人)

2018年04月25日 ⁄ 综合 ⁄ 共 8263字 ⁄ 字号 评论关闭

单点对单点,enter键不是button,而是使用keylistener事件keyadapter适配器

客户端代码:

package chatroom;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Clients extends JFrame{
	private  static JTextField jField;
	private  static JTextArea jArea;
	private  static JPanel jPanel;
	private  static String message;
	private  static BufferedReader is;
	private  static PrintWriter os;
	StringBuffer sb = new StringBuffer();
	
	public Clients()
	{
	  super("客户端");
	}
	
	public void runClients() throws IOException
	{
		initcompent();
		
		Socket socket=new Socket(InetAddress.getLocalHost(),10002);
		JOptionPane.showMessageDialog(null, "connect");
		is=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gb2312"));
		os=new PrintWriter(socket.getOutputStream());
		jField.addKeyListener(new KeyAdapter() {
		@Override
		public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					message=jField.getText();
					if(message.compareTo("")==0)
					{
						JOptionPane.showMessageDialog(null,"null,please input again!");
					}
					else {
						JOptionPane.showMessageDialog(null, "Been sent!");
						os.println(message);
						os.flush();
					}
				}
			}
		});
		
		 while(true){ 
		 String str=is.readLine();
		 sb.append(str+"\n");
	     jArea.setText(sb.toString());
		 jField.setText("");   
		}
	}
	public void initcompent()
	{
		this.setLayout(null);
		jPanel=new JPanel();
		jPanel.setLayout(null);
		this.setContentPane(jPanel);
		
		jField=new JTextField();
		jField.setBounds(20, 10, 350, 30);
		jPanel.add(jField);
		
		jArea=new JTextArea();
		jArea.setBounds(20, 50, 350, 300);
		jPanel.add(jArea);
		
		Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
		this.setPreferredSize(new Dimension(400,400));
		this.setBounds(screensize.width/2-200, screensize.height/2-200, 400, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false);
		
	}
	public static void main(String[] args) throws IOException  {
	   new Clients().runClients();
	}
}

服务器端:

package chatroom;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Severs extends JFrame{
	private  static JTextField jField;
	private  static JTextArea jArea;
	private  static JPanel jPanel;
	private  static String message;
	private  static ServerSocket server;
	private  static Socket socket;
	private  static BufferedReader is;
	private  static PrintWriter os;
	StringBuffer sb = new StringBuffer();

	public Severs()
	{
		super("服务器");
	}
	
	public void runSevers() throws IOException
	{
		initcompent();
		
		server=new ServerSocket(10002);
		socket=server.accept();
		is=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gb2312"));
	    os=new PrintWriter(socket.getOutputStream());
	    
		JOptionPane.showMessageDialog(null, "waitting clients");
		
		jField.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
					message=jField.getText();
					if(message.compareTo("")==0)
					{
						JOptionPane.showMessageDialog(null,"null,please input again!");
					}
					else {
						JOptionPane.showMessageDialog(null, "Been sent!");
						os.println(message);
					    os.flush();
					}
				}
			}
		});
		 while(true){ 
			 String str=is.readLine();
			 sb.append(str+"\n");
		     jArea.setText(sb.toString());
			 jField.setText("");   
		 }
	}
	public void initcompent()
	{
		this.setLayout(null);
		jPanel=new JPanel();
		jPanel.setLayout(null);
		this.setContentPane(jPanel);
		
		jField=new JTextField();
		jField.setBounds(20, 10, 350, 30);
		jPanel.add(jField);
		
		jArea=new JTextArea();
		jArea.setBounds(20, 50, 350, 300);
		jPanel.add(jArea);
		
		Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
		this.setPreferredSize(new Dimension(400,400));
		this.setBounds(screensize.width/2-200, screensize.height/2-200, 400, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false);
		
	}
	public static void main(String[] args) throws IOException {
	   new Severs().runSevers();
	   
	  
	}
}

 

实现多人聊天,只是附加了服务器线程:

客户端:

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.TextArea;
import java.awt.TextField;
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.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Client extends JFrame {
	TextArea textArea = new TextArea();// 创建一个文本域
	TextField textField = new TextField();// 创建一个文本框

	Button button_send = new Button("发送");
	Button button_clear = new Button("清屏");

	static Socket clientLink;
	BufferedReader br;
	PrintStream ps;
	String msg;
	StringBuffer sb = new StringBuffer();

	static {
		try {
			clientLink = new Socket("127.0.0.1",8888);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public Client() {
		super("客户端");
	}

	public void runClient() {
		this.setLocation(400, 450);
		this.setSize(400, 400);
		this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中
		this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中
		this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中
		this.add(button_clear, BorderLayout.WEST);
		this.setVisible(true);// 窗体是否可见
		this.pack();// 自动调整布局
		textField.setText("请输入信息");

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		try {

			br = new BufferedReader(new InputStreamReader(clientLink
					.getInputStream()));
			ps = new PrintStream(clientLink.getOutputStream());

			// 发送按钮事件
			button_send.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					msg = textField.getText();
					System.out.println(msg);
					// 这里不能用缓冲流,向服务器发送信息
					ps.println(msg);
					ps.flush();
				}

			});

			// 回车时,文本域事件
			textField.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					msg = textField.getText();
					// 这里不能用缓冲流写
					ps.println(msg);
					ps.flush();

				}

			});

			// 清屏按钮事件
			button_clear.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					textArea.setText("");
					sb.delete(0, sb.length());
				}
			});

			// 接受服务器信息
			while (true) {
				msg = br.readLine();
				sb.append(msg + "\n");
				textArea.setText(sb.toString());
				textField.setText("");
			}

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != clientLink) {
					clientLink.close();

				}
				if (null != br) {
					br.close();
				}
				if (null != ps) {
					ps.close();
				}

			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) {
		new Client().runClient();
	}

}

服务器端:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {

	static ServerSocket server;
	Socket clientLink;
	List<Socket> clientLinkList = new ArrayList<Socket>();
	int count;

	static {
		try {
			// 开启服务器
			server = new ServerSocket(8888);
			System.out.println("服务器已启动!");

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void runServer() {
		try {
			while (true) {
				clientLink = server.accept();
				System.out.println("连接数:" + (++count));
				clientLinkList.add(clientLink);
				ServerThread st = new ServerThread(clientLinkList, clientLink);
				new Thread(st).start();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		Server server = new Server();
		server.runServer();

	}

} 


服务器线程代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.List;

public class ServerThread implements Runnable {
	List<Socket> clientLinkList;
	Socket clientLink;
	BufferedReader br;
	PrintStream ps;
	String msg;
	String ip;
	public ServerThread(List<Socket> clientLinkList, Socket clientLink) {
		this.clientLinkList = clientLinkList;
		this.clientLink = clientLink;
	}

	@Override
	public void run() {

		try {
			br = new BufferedReader(new InputStreamReader(clientLink
					.getInputStream()));			
			//获得当前用户的IP
			ip=clientLink.getInetAddress().getHostAddress();
			
			//把当前用户发来的信息发送给所有用户.
			while (null != (msg=br.readLine())) {		
				for (int i = 0; i < clientLinkList.size(); i++) {
					ps = new PrintStream(clientLinkList.get(i)
							.getOutputStream());
					ps.println("IP为:"+ip+"的朋友说:"+msg+"\n");
					
					ps.flush();
				}
			}
			
			
		
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(null!=clientLink){
					clientLink.close();
					
				}
				if(null!=br){
					br.close();
				}
				if(null!=ps){
					ps.close();
				}
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

 

 

抱歉!评论已关闭.