java socket 多客户端和服务器的通信

    所谓可以多客户端,就是需要在服务器端进行多线程编程,每一个客户端对应一个线程。如果要实现时时通讯和话,无论是客户端还是服务器端都要至少两个线程,主线程进行发送信息,子线程进行获取信息,这样可以保证时时通信.

下面贴出我的代码:

客户端:

package com.lip;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client
	{

		/**
		 * Author: Lip 
		 * 客户端
		 */
		public static void main(String[] args)
			{
				Socket socket = null;
				BufferedReader br = null;
				PrintWriter pw = null;
				Scanner scanner = new Scanner(System.in);// 从键盘读取
				try
					{
						// 创建客户端socket
						socket = new Socket(Server.HOST, Server.PORT);
						// 读取从客户端发来的消息
						br = new BufferedReader(new InputStreamReader(
								socket.getInputStream()));
						// 写入信息到服务器端
						pw = new PrintWriter(
								new BufferedWriter(new OutputStreamWriter(
										socket.getOutputStream())));
						new ReadServerMessage(br);// 从服务器读取消息
						while (true)
							{
								String temp = scanner.nextLine();// 从键盘读取一行
								pw.println(temp);// 写到服务器
								pw.flush();
								if (temp.equals("q"))
									break;
							}
					}
				catch (Exception e)
					{
						e.printStackTrace();
					}
				finally
					{
						try
							{
								System.out.println("close......");
								br.close();
								pw.close();
								socket.close();
							}
						catch (IOException e)
							{
								e.printStackTrace();
							}
					}

			}

	}

class ReadServerMessage extends Thread//从服务器读取消息
{
	BufferedReader bReader;
    Socket socket;
	public ReadServerMessage(BufferedReader br)
		{
			this.bReader = br;
			start();
		}

	public void run()
		{
			String str = "";
			while (true)//一直等待着服务器的消息
				{
					try
						{
							str = bReader.readLine();
							if (str.equals("q"))
								{
								  bReader.close();
								  socket.close();
								  break;
								}
						}
					catch (IOException e)
						{
							e.printStackTrace();
						}
					System.out.println("Server Message:" + str);
				}
		}
}

服务器端:

package com.lip;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
	{

		/**
		 * Author:Lip Desc:SSD8_exercise1
		 */
		public static int PORT = 8000;
		public static String HOST = "127.0.0.1";

		public static void main(String[] args)
			{
				ServerSocket serverSocket = null;
				Socket socket = null;
				try
					{
						serverSocket = new ServerSocket(PORT);
						// 等待请求,无请求一直等待
						while (true)
							{
								System.out.println("Waiting Client");
								socket = serverSocket.accept();// 接受请求
								System.out.println("Client Conect!");
								new ThreadedServer(socket);
							}
					}
				catch (Exception e)
					{
						try
							{
								socket.close();
							}
						catch (IOException e1)
							{
								e1.printStackTrace();
							}
					}
				finally
					{
                       try
						{
							serverSocket.close();
						}
					catch (IOException e)
						{
							e.printStackTrace();
						}
					}

			}

	}

辅助线程:

package com.lip;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ThreadedServer extends Thread
	{

		private Socket socket = null;
		private BufferedReader br = null;
		private PrintWriter pw = null;
		private Scanner scanner = null;

		public ThreadedServer(Socket s)
			{
				socket = s;
				try
					{
						br = new BufferedReader(new InputStreamReader(
								socket.getInputStream()));
						pw = new PrintWriter(
								new BufferedWriter(new OutputStreamWriter(
										socket.getOutputStream())), true);
						scanner = new Scanner(System.in);// 从键盘读取数据
						start();
					}
				catch (Exception e)
					{

						e.printStackTrace();
					}
			}

		public void run()
			{
				new ReadClientMessage(br, socket);//读取客户端数据
				while (true)//向客户端发送数据
					{
						try
							{
								pw.println(scanner.nextLine());
								pw.flush();
							}
						catch (Exception e)
							{
								try
									{
										br.close();
										pw.close();
										socket.close();
									}
								catch (IOException e1)
									{
										e1.printStackTrace();
									}
							}
					}
			}

	}

class ReadClientMessage extends Thread
	{
		BufferedReader bReader;
        Socket socket;
		public ReadClientMessage(BufferedReader br,Socket s)
			{
				this.bReader = br;
				this.socket=s;
				start();
			}

		public void run()
			{
				String str = "";
				while (true)
					{
						try
							{
								str = bReader.readLine();
								if (str.equals("q"))
									{
									  bReader.close();
									  socket.close();
									  break;
									}
							}
						catch (IOException e)
							{
								e.printStackTrace();
							}
						System.out.println("Client Message:" + str);
					}
			}
	}

现在就可以实现多客户端和服务器端通信了 ,不过客户端和客户端的通信暂时还没有搞懂,还要继续去学习。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值