利用java socket实现多线程局域网聊天应用

       刚接触java网络编程,实现了利用socket多线程局域网聊天工具。先由客户端发送数据给服务器,然后由服务器把数据写入流中,发送到各个客户端中,主要涉及的技术是socket的应用,多线程的应用以及各个流过滤的应用编写。大家可以参考一下,不足之处,多多指教。

服务器:

package sockettest;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
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.ServerSocket;
import java.net.Socket;
import java.rmi.server.UID;
import java.sql.Connection;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import second.third;


public class ServerUI  {
	public static int num=0;
	public static Socket[] sockets=new Socket[100];
	public static void main(String[] args) throws Exception
	{

	//	ServerUI serverUI=new ServerUI();
		ServerSocket soc=new ServerSocket(9999);
		while (true) {//服务器一直处于开启状态,每个客户端都有一个线程产生
		 Socket socket=soc.accept();
			 sockets[num++]=socket;
			 new serverchat(socket).start(); 
		}
	}


}
class serverchat extends Thread{
	Socket socket;
	public serverchat(Socket socket)
	{
		this.socket=socket;
	}
	
	public void run(){
		try{
			BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String clientString=null;
			while ( (clientString=in.readLine()) !=null) {
				for(int i=0;i<ServerUI.num;i++)//遍历所有与服务器链接的客户端
				{
					System.out.println(clientString+"\n");
					 PrintStream printStream=new PrintStream(ServerUI.sockets[i].getOutputStream());
					printStream.println(clientString);
				}
				
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

客户端:

package sockettest;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
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.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import second.third;


public class ClientUI extends JFrame implements ActionListener {

	JTextArea mainArea=new JTextArea(10,30);
	JTextField sendField=new JTextField(30);
	JTextField ipField=new JTextField(10);
	JTextField portField=new JTextField(10);
	JButton linkbButton;
	Socket socket;
	int flag=0;

	public  ClientUI() throws Exception {
		super("客户端");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,300);
		setLayout(new BorderLayout());
		JPanel panel=new JPanel(new FlowLayout());
		JLabel label=new JLabel("IP:");
		JLabel label2=new JLabel("PORT:");
		linkbButton=new JButton("connect!");
		ipField.setText("127.0.0.1");
		portField.setText("9999");
		panel.add(label);
		panel.add(ipField);
		panel.add(label2);
		panel.add(portField);
		panel.add(linkbButton);
		linkbButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
			if(ipField.getText().equals("127.0.0.1")&&portField.getText().equals("9999"))
				flag=1;
			else {
				flag=0;
			}
			}
		});
		JPanel panel2=new JPanel(new FlowLayout());
		JButton button=new JButton("ok");
		
		panel2.add(new JLabel("input:"));
		panel2.add(sendField);
		panel2.add(button);
		
		add(panel,BorderLayout.NORTH);
		add(mainArea,BorderLayout.CENTER);
		add(panel2,BorderLayout.SOUTH);
		
		setVisible(true);

		socket=new Socket("218.192.102.210",9999);
		new clientchat(socket).start();
	    final PrintStream socketstream=new PrintStream(socket.getOutputStream());
        button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				String inputString=sendField.getText().trim();
				if(inputString.length()>0)
					socketstream.println(inputString);		
				sendField.setText("");
			}
		});
		
		
		
	}
	
	
	public static  void main(String[] args) throws Exception
	{
		ClientUI clientUI=new ClientUI();
		
	}
	
	
	
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

	
	class clientchat extends Thread{
		Socket socket;
		public clientchat(Socket socket)
		{
			this.socket=socket;
		}
		
		public void run(){
			
			try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));){
				String line;//从网络上来读取socket的值,打印在text上
				while ((line=br.readLine())!=null) {
					System.out.println(line+"\n");
					mainArea.append(line+"\n");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值