`
taote
  • 浏览: 33604 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
之前一直与网站打交道,知道点通过浏览器等遵循http等协议进行网络通信,但是对于2台计算机之间的通信一直不是很明白,这几天温习了Java中的socket编程(中文“套接字”),Java中的java.net包对网络连接的低层做了很好的处理,我们在进行通信处理也是较为简单。
一、工作方式
1.服务器应用程序对特定端口创建出ServerSocket

ServerSocket serverSock = new ServerSocket(4242);//这回让服务器应用程序开始监听来自4242端口客户端的请求

2.客户端对服务器应用程序建立Socket连接

Socket sock = new Socket("190.168.1.1",4242)//客户端得知道IP地址与端口号

3.服务器创建出与客户端通信的新Socket

Socket sock = serverSock.accept();//accept()方法会在等待用户的Socket连接时闲置着。监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。当用户连上来时,此方法返回一个Socket(在不同的端口上)以便于客户端通信。Socket与ServerSocket的端口号不相同,因此ServerSocket可以空出来等待其他的用户。

二、
下面是一个简单的通信过程,服务端Myserver,当一次通话连接上时产生一个新的线程,与客户端进行通话,这里面便通过多线程实现了通话的同步,可以有多个客户端连上服务端,基本上上可以同时实现通信。
public class Myserver {

	public static ServerSocket myserver;

	public static void main(String[] args) {
		try {
			myserver = new ServerSocket(2222);
			while (true) {
	            Socket socket = myserver.accept();
				Thread t = new Thread(new ThreadSocket(socket));
				t.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

服务端线程:
public class ThreadSocket implements Runnable {
	private Socket socket;

	ThreadSocket(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			// 取得连接socket上低层输入串流的inputStreamReader,并用BufferedReader读取
			BufferedReader in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			// 向串口输出流
			PrintWriter out = new PrintWriter(socket.getOutputStream());

			while (true) {
				String str = in.readLine();
				System.out.println("your input is :" + str);
				out.println("has receive...");
				out.flush();
				if (str.equals("end"))
					break;
			}
			in.close();
			out.close();
			socket.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

服务端接收客服端的输出,收到后打印出,然后发送"has receive..."回客户端。若从客户端接收到“end”,关闭输入输出流与通话。
public class Myclient {
	public Myclient() throws UnknownHostException, IOException {

		Socket client = new Socket(InetAddress.getLocalHost(), 2222);
		PrintWriter out = new PrintWriter(client.getOutputStream());
		// 客户端从键盘输入信息
		BufferedReader in1 = new BufferedReader(
				new InputStreamReader(System.in));
		// 客户端建立输入流并进行封装
		BufferedReader in2 = new BufferedReader(new InputStreamReader(client
				.getInputStream()));
		while (true) {
			String str1 = in1.readLine();
			
			out.write(str1+"\r\n");
			out.flush();
			if(str1.equals("end"))
				break;
			System.out.println(str1);
			String str2 = in2.readLine();
			System.out.println("str2:"+str2);
		}
		in1.close();
		in2.close();
		out.close();
		client.close();
	}

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		new Myclient();
	}
}

注意客户端有2个输入端,一口监听键盘输入,一口监听socket输入(即服务端的输出),将键盘输入发送出去,同时若键盘输入"end",同样,关闭各流及连接。
注意:out.write(str1+"\r\n");在发送字符后加上"\r\n",因为我们读取的时候常用,readLine(),即从缓冲区中读取字符,知道遇到"\r"或"\n"为止,不加上的话接收方不能很好的读到,可能就会卡住。当然out.write(str1+"\r\n")也可以写作out.println(str1).
输出:
当我们在键盘上输入:Forza inter!
客户端控制台:
Forza Inter!
str2:has receive...

服务端控制台:
your input is :Forza Inter!

三、
现在通过多线程可以实现多人同时通话,不断的连接,不断的产生新的通话,新的线程。如果是一个大型的或者要求较高的实现可能会要求我们控制同时连接的通话数量。那样的话我们就可以通过建立线程池的方法来自动管理。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics