当前位置:首页 > 开发 > 互联网 > 正文

Socket编程 基本的聊天实现。

发表于: 2014-11-12   作者:alleni123   来源:转载   浏览:
摘要: public class Server { //用来存储所有连接上来的客户 private List<ServerThread> clients; public static void main(String[] args) { Server s = new Server(); s.startServer(9988); } publi
public class Server
{

	//用来存储所有连接上来的客户
	private List<ServerThread> clients;
	
	public static void main(String[] args)
	{
		Server s = new Server();
		s.startServer(9988);
	}

	public void startServer(int port)
	{
		ServerSocket ss = null;
		Socket socket = null;
		try
		{
			ss = new ServerSocket(port);
			clients=new ArrayList<ServerThread>();
			while (true)
			{
				System.out.println("waiting...");
				socket = ss.accept();
				ServerThread st = new ServerThread(socket);
				new Thread(st).start();
			}
		}
		catch (IOException e)
		{

			e.printStackTrace();
		}
		finally
		{
			SocketUtils.closeSocketServer(ss);

		}
	}

	private class ServerThread implements Runnable
	{

		private Socket s = null;
		private BufferedReader br;
		private PrintWriter out;
		private String address;
		private String username;

		private boolean flag;

		public ServerThread(Socket s) throws IOException
		{
			this.s = s;
			br = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
			out = new PrintWriter(s.getOutputStream(),true);
			
			username=br.readLine();
			System.out.println("username="+username);
			
			address = s.getInetAddress().getHostAddress() + ":" + s.getPort();
		//	System.out.println(name + "连接上来了");
			clients.add(this);
			send(username+"上线了");
		}

		private void stop()
		{
			System.out.println(username+"已经离开了");
			clients.remove(this);
			flag = false;
		}

		
		/**
		 * 接收用户的信息
		 */
		private void receive()
		{
			String str = null;
			try
			{
				while ((str = br.readLine()) != null)
				{
					if (str.equalsIgnoreCase("quit"))
					{
						// 关闭
						stop();
						out.println("disconnect");
						break;
					}
					
					String sendMsg=username+":"+str;
					
				//	out.println(username+":"+ str);
					
					//给所有的用户发送信息
					send(sendMsg);
					
					System.out.println("out");
				}
			}
			catch (IOException e)
			{
				stop();
				System.out.println("用户非正常死亡->"+username);
			}finally{
				SocketUtils.closeSocket(s);
			}
		}
		
		
		/**
		 * 给用户发信息
		 * @param msg
		 */
		private void send(String msg){
			for(ServerThread st:clients){
				st.out.println(msg);
			}
		}
		

		public void run()
		{
			// if(!flag)break;
			receive();

		}

	}

}




public class Client
{
	
	private Socket s;
	private BufferedReader br;
	private PrintWriter out;
	
	private boolean flag=true;
	
	public static void main(String[] args)
	{	
		Client c=new Client();
	 //	c.sendMessage();
		c.startup();
	}
	
	
	public void startup(){
		BufferedReader sbr=null;
		
		try
		{
			s=new Socket("127.0.0.1",9988);
			//s=new Socket("115.28.240.213",9988);
			out=new PrintWriter(s.getOutputStream(),true);
			out.println("myname");
			br=new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
			
			sbr=new BufferedReader(new InputStreamReader(System.in));
			new Thread(new ClientThread()).start();
			String str=null;
			
			while((flag)&&(str=sbr.readLine())!=null){
				if(!flag)break;
				String msg=new String(str.getBytes("gbk"),"utf-8");
				out.println(msg);
			}
			
		}
		catch (UnknownHostException e)
		{
			
			e.printStackTrace();
		}
		catch (IOException e)
		{
			
			e.printStackTrace();
		}
	}
	
	

	 
	private void closeSocket(Socket s){
		if(s!=null){
			try
			{
				s.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	
	private void receive(){
		try
		{
			String rs=br.readLine();
			if(rs.equalsIgnoreCase("disconnect")){
				flag=false;
				System.out.println("按回车退出");
				return ;
			}
			System.out.println(rs);
		}
		catch (IOException e)
		{
			
			e.printStackTrace();
		}
	}
	
	
	private class ClientThread implements Runnable{
		
		
		
		@Override
		public void run()
		{
			while(true){
				if(!flag)break;
				receive();
			}
		}
		
	}
	 
}

Socket编程 基本的聊天实现。

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
各个主要函数的功能: 1、socket int socket(int domain, int type,int protocol) domain:说明我们
1 C#使用SOCKET编程实现服务器+客户端的聊天程序示例 [日期:2009-12-28] 来源: 作者: [字体:大
网上很多基于Socket的聊天实现都是不完整的,于是写了个Demo(需要的童鞋可以在此基础上进行优化) 完
  上一小节,已经讲到可以每个人多说话,而且还没有限制,简单的来说,我们已经完成了聊天的功能
  上一小节讲到可以实现多客户端与服务器进行通讯,对于每一个客户端的连接请求,服务器都要分配
  上一小节我们讲了使用select来避免使用多进程的资源浪费问题。上次只是实现了从多个客户端发送
  这一小节将增加一个用户的结构体,用于保存用户的用户名和密码,然后发给服务器,然后在服务器
  接上一小节,本来是计划这一节用来讲数据库的增删改查,但是在实现的过程中,出现了一点小问题
  上一节已经完成了对用户的身份验证了,既然有了验证,那么接下来就能对不同的客户端进行区分了
  这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号