先把代码贴出来:
/**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
importjava.io.*;
importjava.net.*;
importjava.util.Scanner;
publicclasstcps
{
publicstaticvoidmain(String[]args)
{
if(args.length!=1)
{
System.out.println("usage: tcps ");
System.exit(0);
}
server(args[0]);
}
publicstaticvoidserver(Stringport)
{
intPort=Integer.parseInt(port);
try{
ServerSocketss=newServerSocket(Port);
Sockets=ss.accept();
//OutputStream os=s.getOutputStream();
PrintWriterpw=newPrintWriter(s.getOutputStream(),true);
//InputStream is=s.getInputStream();
Scannersc=newScanner(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));
Stringmesg=sc.nextLine();
System.out.println(mesg);
//is.close();
//os.close();
s.close();
ss.close();
}
catch(Exceptionex)
{
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
importjava.io.*;
importjava.net.*;
importjava.util.Scanner;
publicclasstcpc
{
publicstaticvoidmain(String[]args)
{
if(args.length!=2)
{
System.out.println("usage: udpc ");
System.exit(1);
}
client(args[0],args[1]);
}
publicstaticvoidclient(Stringaddr,Stringport)
{
StringSrvAddr=addr;
intPort=Integer.parseInt(port);
try{
Sockets=newSocket(InetAddress.getByName(SrvAddr),Port);
//OutputStream os=s.getOutputStream();
PrintWriterpw=newPrintWriter(s.getOutputStream(),true);
//InputStream is=s.getInputStream();
Scannersc=newScanner(s.getInputStream());
byte[]buf=newbyte[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(Exceptionex)
{
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
importjava.io.*;
importjava.net.*;
publicclassudps
{
publicstaticvoidmain(String[]args)
{
if(args.length!=1)
{
System.out.println("usage: udps ");
System.exit(0);
}
server(args[0]);
}
publicstaticvoidserver(Stringport)
{
intPort=Integer.parseInt(port);
try
{
DatagramSocketserv=newDatagramSocket(Port);
byte[]buf=newbyte[100];
DatagramPacketdp=newDatagramPacket(buf,100);
serv.receive(dp);
System.out.println(newString(dp.getData(),0,dp.getLength()));
Stringstr="welcome udp client";
DatagramPacketdps=newDatagramPacket(str.getBytes(),str.length(),
dp.getAddress(),dp.getPort());
serv.send(dps);
serv.close();
}
catch(Exceptionex)
{
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
importjava.io.*;
importjava.net.*;
publicclassudpc
{
publicstaticvoidmain(String[]args)
{
if(args.length!=2)
{
System.out.println("usage: udpc ");
System.exit(1);
}
client(args[0],args[1]);
}
publicstaticvoidclient(Stringaddr,Stringport)
{
try{
DatagramSocketcli=newDatagramSocket();
Stringstr="this is udp client";
StringSrvAddr=addr;
intPort=Integer.parseInt(port);
DatagramPacketdp=newDatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName(SrvAddr),Port);
cli.send(dp);
byte[]buf=newbyte[100];
DatagramPacketdpr=newDatagramPacket(buf,buf.length);
cli.receive(dpr);
System.out.println(newString(buf,0,dpr.getLength()));
cli.close();
}
catch(Exceptionex)
{
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测试例子修改修改,也发上来对比一下。
相关