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字符串的直接传输,所以接受端必须也以包格式接受才行,据此可以推出她的兼容性