先把代码贴出来:
/**tcps.java**/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import java.io.*; import java.net.*; import java.util.Scanner; public class tcps { public static void main(String[] args) { if(args.length != 1) { System.out.println("usage: tcps <port>"); System.exit(0); } server(args[0]); } public static void server(String port) { int Port = Integer.parseInt(port); try{ ServerSocket ss=new ServerSocket(Port); Socket s=ss.accept(); //OutputStream os=s.getOutputStream(); PrintWriter pw=new PrintWriter(s.getOutputStream(),true); //InputStream is=s.getInputStream(); Scanner sc=new Scanner(s.getInputStream()); //byte[] buf=new byte[100]; //os.write("welcome".getBytes()); pw.println("welcome tcp client"); //int len=is.read(buf); //System.out.println(new String(buf,0,len)); String mesg = sc.nextLine(); System.out.println(mesg); //is.close(); //os.close(); s.close(); ss.close(); } catch(Exception ex) { ex.printStackTrace(); } } } |
/**tcpc.java**/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import java.io.*; import java.net.*; import java.util.Scanner; public class tcpc { public static void main(String[] args) { if(args.length != 2) { System.out.println("usage: udpc <serverIP> <port>"); System.exit(1); } client(args[0],args[1]); } public static void client(String addr,String port) { String SrvAddr=addr; int Port=Integer.parseInt(port); try{ Socket s=new Socket(InetAddress.getByName(SrvAddr),Port); //OutputStream os=s.getOutputStream(); PrintWriter pw=new PrintWriter(s.getOutputStream(),true); //InputStream is=s.getInputStream(); Scanner sc=new Scanner(s.getInputStream()); byte[] buf=new byte[100]; //os.write("this is client".getBytes()); pw.println("this is tcp client"); //int len=is.read(buf); //System.out.println(new String(buf,0,len)); System.out.println(sc.nextLine()); //is.close(); //os.close(); s.close(); } catch(Exception ex) { ex.printStackTrace(); } } } |
/**udps.java**/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import java.io.*; import java.net.*; public class udps { public static void main(String[] args) { if(args.length != 1) { System.out.println("usage: udps <port>"); System.exit(0); } server(args[0]); } public static void server(String port) { int Port=Integer.parseInt(port); try { DatagramSocket serv=new DatagramSocket(Port); byte[] buf=new byte[100]; DatagramPacket dp=new DatagramPacket(buf,100); serv.receive(dp); System.out.println(new String(dp.getData(),0,dp.getLength())); String str="welcome udp client"; DatagramPacket dps=new DatagramPacket(str.getBytes(),str.length(), dp.getAddress(),dp.getPort()); serv.send(dps); serv.close(); } catch(Exception ex) { ex.printStackTrace(); } } } |
/**udpc.java**/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import java.io.*; import java.net.*; public class udpc { public static void main(String[] args) { if(args.length != 2) { System.out.println("usage: udpc <serverIP> <port>"); System.exit(1); } client(args[0],args[1]); } public static void client(String addr, String port) { try{ DatagramSocket cli=new DatagramSocket(); String str="this is udp client"; String SrvAddr=addr; int Port=Integer.parseInt(port); DatagramPacket dp= new DatagramPacket(str.getBytes(),str.length(), InetAddress.getByName(SrvAddr),Port); cli.send(dp); byte[] buf=new byte[100]; DatagramPacket dpr=new DatagramPacket(buf, buf.length); cli.receive(dpr); System.out.println(new String(buf,0,dpr.getLength())); cli.close(); } catch(Exception ex) { ex.printStackTrace(); } } } |
看一下运行的结果:
在本地上运行,所有的地址都可以解析,唯一的遗憾就是没有办法抓到本地的包,否则可以看一下数据通信是什么样子的。另外一点就是现在的交换机好像都不支持IPv6协议,我在机房的一台linux上连接本地Win7上的服务,用v6地址时提示无法到达的路由。
上面代码的基本结构来自于孙鑫老师的Java课程,里面有些内容比较过时了(课程是基于JDK1.4版本的),所以后面又找了一些Java资料,重新改写了InputStream和OutputStream的一些内容,否则在使用JDK7的javac编译时会提示使用了一些废弃的接口==提示。
总之,用Java测试socket还是比较简单的,相比C下面的就容易多了,而且不用考虑IPv4和IPv6等复杂的地址关系,Java可以同时处理这两种类型的地址协议,只需要getHostByName()就可以自动赋值v4或者v6地址,而且ServerSocket会自动绑定本地所有的v4和v6的地址,很方便于使用。我这也是现学现卖(看变量名就知道了),连Java的基础数据结构和语法还都没有记清楚,只能做几个小例子自娱自乐一下,过两天把C的socket测试例子修改修改,也发上来对比一下。