Socket可以理解为网络编程的接口,既然是网络传输,就至少有两端,一个Server,一个Client,当然这个划分也很模糊,有时候Server和Client也可以相互转化.总之Socket就是实现了数据在Server和Client间的互相流动.
目前至少有两种基于协议的Socket,TCP/IP Socket和 UDP Socket
1,UDP协议相对简单一些,直接把要发送的数据通过Socket API进行打包如package,并send即可
2,TCP Socket复杂一点,因为她要通过三次握手协议,只有确定另外一端已经连接上Socket,她才发送数据
比如在Server端,建立一个ServerSocket,并且设置处于监听状态Listening,当Client端的Socket启动,并且试图
connectServer的时候,Server才做出响应并发送数据流
当然你可能认为Socket很好理解,那么要你写一个完整的Socket又如何呢?实际上有很多的源码,已经写好了的
我也不太喜欢理论型的技术,而且也懒的总结,所以还是直接把源码列出来,有别人的,也有我自己的.当然代码是肯定经过我测试通过的
我自己在单机上测试的时候是直接启动一个MyEclipse,一个Eclipse,分别做为两端,查看端口的时候可以在命令行输入:netstat -a 来看是否打开端口或者端口是否被监听和占用
首先来UDP的(UDP的有些兼容性的问题,不过有时候不失为一种选择)
服务器端:
import java.io.*;
import java.net.*;
public class Srv12 extends Thread
{
DatagramSocket ServerSocket;
public Srv12()
{
super("FortuneServer1");
try
{
ServerSocket = new DatagramSocket(9528);
System.out.println("FortuneServer up and running...");
}
catch (SocketException e)
{
System.err.println("Exception: couldn't create datagram socket");
System.exit(1);
}
}
public static void main(String[] args)
{
Srv12 server = new Srv12();
server.start();
}
public void run()
{
if (ServerSocket == null)
return;
while (true)
{
try
{
InetAddress address;
int port;
DatagramPacket packet;
byte[] data = new byte[128];
String ss;
packet = new DatagramPacket(data, data.length);
ServerSocket.receive(packet);
//如果1114端口没有请求到数据,就一直停留在这里等待数据接收
//如果接收到数据,则将数据包放在packet对象中,并在下面对其解析
address = packet.getAddress();
port = packet.getPort();
ss=new String(data);
System.out.println(ss);
/*FileWriter fw = new FileWriter("Fortunes.txt");//创建新文件
PrintWriter out = new PrintWriter(fw);
for(int i=0;i<data.length;i++){
out.print(data[i]+" ");
}
out.close();
System.out.println("Data has been writen to destination!");*/
//再次创建数据包,发送到接收的数据的端口
packet = new DatagramPacket(data, data.length, address, port);
ServerSocket.send(packet);
System.out.println("Respond has been made!");
}
catch (Exception e)
{
System.err.println("Exception: " + e);
e.printStackTrace();
}
}
}
}
客户端:
import java.net.*;
public class Client12
{
public static void main(String args[])
{
Client12 client = new Client12();
System.out.println(client.getMessage());
}
public String getMessage()
{
String fortune;
try {
DatagramSocket socket;
DatagramPacket packet;
byte[] data = new byte[128];
for(int i=0;i<data.length;i++){
Integer integer=new Integer(i);
data[i]=integer.byteValue();
}
socket = new DatagramSocket();
//packet = new DatagramPacket(data, data.length,InetAddress.getByName("127.0.0.1"), 1114);
packet = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 10000);
System.out.println("AAAAA");
socket.send(packet);
packet = new DatagramPacket(data, data.length);
socket.receive(packet);
fortune = new String(packet.getData());
socket.close();
}
catch (UnknownHostException e) {
System.err.println("Exception: host could not be found");
return null;
}
catch (Exception e) {
System.err.println("Exception: " + e);
e.printStackTrace();
return null;
}
return fortune;
}
}
UDP就是把数据打包到packet,由于她是包传输,不同于TCP Socket字符串的直接传输,所以接受端必须也以包格式接受才行,据此可以推出她的兼容性