通过socket对象可以获取通信对方的socket信息
客户端:
import java.net.*; import java.io.*; public class TestServer { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8888); while(true) { Socket s1 = s.accept(); OutputStream os = s1.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeUTF("Hello"+s1.getInetAddress()+"#port"+s1.getPort()+"bye bye"); dos.close(); s1.close(); } } catch(IOException e) { System.out.println("程序运行出错:"+e); } } }
用户端:
import java.net.*; import java.io.*; public class TestClient { public static void main(String[] args) { try { Socket s1 = new Socket("192.168.56.1",8888); InputStream is = s1.getInputStream(); DataInputStream dis = new DataInputStream(is); System.out.println(dis.readUTF()); dis.close(); s1.close(); } catch(ConnectException connExc) { connExc.printStackTrace(); System.out.println("服务器连接失败!"); } catch(IOException e) { e.printStackTrace(); } } }
结果: Hello/192.168.56.1#port56660bye bye
s1.getInetAddress() 这个是拿到ip地址的意思,注意这里拿的是客户端的ip地址。因为这个s1拿的是对面client的ip
s1.getPort() 拿的是客户端的端口号 (注意,拿到的端口号可不是8888,8888是服务器的端口号,拿到的端口号56660是本身这个客户端连上去显示的端口号,是随机选的。)
然后我们试一个互相两边都能通话的例子:
server:
import java.net.*; import java.io.*; public class TestSocketServer { public static void main(String[] args) { InputStream in = null; OutputStream out = null; try { ServerSocket ss = new ServerSocket(5888); Socket socket = ss.accept(); in = socket.getInputStream(); out = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); DataInputStream dis = new DataInputStream(in); String s = null ; if((s = dis.readUTF())!=null) { System.out.println(s); System.out.println("from"+socket.getInetAddress()); System.out.println("port"+socket.getPort()); } dos.writeUTF("hi,fuck you "); dis.close(); dos.close(); socket.close(); } catch(IOException e) { e.printStackTrace(); } } }
client:
import java.net.*; import java.io.*; public class TestSocketClient { public static void main(String[] args) { InputStream is = null; OutputStream os = null; try { Socket socket = new Socket("localhost",5888); is = socket.getInputStream(); os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); dos.writeUTF("ok!yes you are right!"); String s = null; if((s = dis.readUTF())!=null) { System.out.println(s); } dos.close(); dis.close(); socket.close(); } catch(UnknownHostException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
必须是一个先读,一个先写。要是两个都先写,就会两个都卡在那。因为这个readUTF()是堵塞式的。不然就会死死地卡在那。