局域网javasocket通信
java编程对于Socket之间的通信过程如下:
服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看一些服务端与客户端通信的例子:
publicclassServer{
publicstaticvoidmain(Stringargs[])throwsIOException{
//为了简单起见,所有的异常信息都往外抛
intport=8899;
//定义一个ServerSocket监听在端口8899上
ServerSocketserver=newServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}
}
客户端代码
Java代码publicclassClient{
publicstaticvoidmain(Stringargs[])throwsException{
//为了简单起见,所有的异常都直接往外抛
Stringhost="127.0.0.1";//要连接的服务端IP地址
intport=8899;//要连接的服务端对应的监听端口
//与服务端建立连接
Socketclient=newSocket(host,port);
//建立连接后就可以往服务端写数据了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//写完后要记得flush
writer.close();
client.close();
}
}
这方面的 我也做过,建议用DataInputStream 做底层,然后用其他高级流,做装饰,这样穿不会丢失,我以前也做了一个如果要源代码,给我留言,不会丢失文件的
『叁』 java中Socket通信问题:Socket通信是不是只能在局域网中用
如果服务器是单机上网 那你需要知道的是服务器在nternet网上的地址
服务器访问http://www.ip138.com/ 就看得出来 假设是58.100.15.199
那你修改192.168.209.1为 58.100.15.199 就可以了
如果服务器在局域网里 通过路由器上网的
那你是不能直接连接到局域网的服务器上的
那你得在路由器里设置端口映射 设置端口1234端口 映射到 192.168.209.1 1234端口
那样的话 然后同样方法获取到路由器在外网的IP 你socket连接这个路由器外网IP即可
实际上,很多上网时动态IP的,你可以安装花生壳之类的软件。获取动态IP
客户端解析花生壳域名就能得到服务器IP。很多路由器自带动态域名支持。
『肆』 用JAVA Socket可以实现同一路由器下的两台电脑进行通信。那么如果不是同一路由器的电脑可以通信吗
可以 但是会困难很多 就像qq这样的软件
首先就是把设的大一些 这样保证过路由的时候不会把你的包扔了
其次就是一个NAT的问题,如果是你和固定ip的服务器连接还好,就怕是两个客户端点点互联,对等体的连接是有些困难的,因为所有的pc几乎都在NAT后面
比如你是192.168.0.1 而我是192.168.0.2 可是杂俩根本就不在一个网段,
这两个地址都是只是NAT后面的保留地址
过NAT的时候,可能你实际是123.1.1.1 而我是203.1.1.1 这次是这样 下次还会变 DHCP么
两个进程要想通信,就得知道彼此的真实socket
两个程序怎么知道彼此的ip呢?
这就需要一个固定ip的第三点(中心点服务器)
你和我上来都进行对固定ip的第三点连接 第三点就会拿到你和我的NAT前面的真实地址
然后第三方 把我的真实地址告诉你 把你的告诉我
这样咱们就可进行点对点了
这就像我不知道你的电话,你也不知道我的电话,咱们怎么联系
只能通过路人甲,这个路人甲的电话是固定且已知的,咱们都先给路人甲打电话,然后他手机就能显示你的和我的号码了,他再把彼此的号码发给对方,双方就知道对方的号码了,就可以互相打电话了
比如TCP与UDP的打洞和穿洞 就是这种NAT穿越技术 这是P2P的基础 也是真实网络环境下点点互联的一个比较普遍的方案