看到一段代码如下:
package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(10000);
while (true) {
Socket socket = server.accept();
invoke(socket);
}
}
private static void invoke(final Socket client) throws IOException {
new Thread(new Runnable() {
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream());
while (true) {
String msg = in.readLine();
System.out.println(msg);
out.println("Server received " + msg);
out.flush();
if (msg.equals("bye")) {
break;
}
}
} catch(IOException ex) {
ex.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {}
try {
out.close();
} catch (Exception e) {}
try {
client.close();
} catch (Exception e) {}
}
}
}).start();
}
}
下面是Client程序代码:
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 10000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String msg = reader.readLine();
out.println(msg);
out.flush();
if (msg.equals("bye")) {
break;
}
System.out.println(in.readLine());
}
socket.close();
}
}
如上是多线程通信的实例。但是我对socket还是有不懂的地方。
比如socket对象是如何共用一个端口号的?当服务器监听到一个socket对象,new一个新线程,是以发数据包过来的client的ip为标识吗?还是包含了其他标识,比如client程序的端口号?
我想知道同一个ip执行两个client程序,服务器程序会不会当成一个socket,而不新建线程?还是当client执行第二个client程序后再new一个线程?
socket网络
package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(10000);
while (true) {
Socket socket = server.accept();
invoke(socket);
}
}
private static void invoke(final Socket client) throws IOException {
new Thread(new Runnable() {
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream());
while (true) {
String msg = in.readLine();
System.out.println(msg);
out.println("Server received " + msg);
out.flush();
if (msg.equals("bye")) {
break;
}
}
} catch(IOException ex) {
ex.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {}
try {
out.close();
} catch (Exception e) {}
try {
client.close();
} catch (Exception e) {}
}
}
}).start();
}
}
下面是Client程序代码:
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 10000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String msg = reader.readLine();
out.println(msg);
out.flush();
if (msg.equals("bye")) {
break;
}
System.out.println(in.readLine());
}
socket.close();
}
}
如上是多线程通信的实例。但是我对socket还是有不懂的地方。
比如socket对象是如何共用一个端口号的?当服务器监听到一个socket对象,new一个新线程,是以发数据包过来的client的ip为标识吗?还是包含了其他标识,比如client程序的端口号?
我想知道同一个ip执行两个client程序,服务器程序会不会当成一个socket,而不新建线程?还是当client执行第二个client程序后再new一个线程?
socket网络
解决方案 »
- 关于浮点数的运算
- web services的安全验证!(急!在线等待!)
- <html:select>标签的问题
- 有10年VC,面向对象经验,怎么开始学习JAVA成为架构师?
- 求ibatis映射文件中resultMap及statement如何写
- JBoss4 jbosscmp-jdbc.xml 对自增值的配置问题
- 请教webservic的服务器是windows下的tomcat,而客户端是linx的时候,一个让我焦头烂额的问题。
- 【求助】我的bean找不到另一个类!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 现在绑我澄清一下概念:
- WAP开发中,中文显示如何做到?
- java 不能获取当前串口
- 大家来说说ssh整合开发
Socket socket = new Socket("localhost", 10000);
这里的localhost以及10000指的是服务器端的地址和监听端口(这里用了localhost,说明server和client是同一台机器)。client的local 端口会自动分配一个未占用的。而服务器端收到TCP链接请求后,也会自动分配一个服务器端的端口,所以新建立的socket的两端的端口都不是10000。
新建立的socket的remote以及local端口可以通过getLocalPort() 以及getPort()查到 并且,新建socket不会新建线程,线程需要你自己建立,然后把新建的socket的引用传过去
也就是说,实际上每当监听到一个请求,服务器就会新分配一个端口号与Client对话吗?