Socket:
两个java应用程序可通过一个双向的网络通信连续实现数据交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现client-server连接。
Java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端(像qq那样,互相通信)。
建立连接时所需要的寻址信息为远程计算机的IP地址和端口号(port number)。
TCPSocket模型:
过程:
一个Server端多个Client端:
一端和另一段说话一端说一端听:
server端:
import java.net.*; //一端和另外一端说话,一端说一端听。 /* 1 java Socket编程步骤。 * 2 Socket/ServerSocker类用法。 * 3 通过Socket对象可以获取通信对方Socket的信息。 * */ import java.io.*; public class TestServer { public static void main(String[] args) { try { //在服务器端建立自己的一个插座口。 ServerSocket s = new ServerSocket(8888); while(true) { //接受来自客户端的请求。 Socket s1 = s.accept(); //写入到Client的管道(流) OutputStream os = s1.getOutputStream(); //在管道上加上一层保障。也就是形成双层管道。 DataOutputStream dos = new DataOutputStream(os); //和客户端通话,写入到客户端。 //字符串hello ip地址,端口号。 //客户端这样可以从服务器端读出了。 dos.writeUTF("Hello" + s1.getInetAddress() + "port#" + s1.getPort()+ " bye-bye!"); dos.close(); s1.close(); } } catch(IOException e) { e.printStackTrace(); System.out.println("程序运行出错:" + e); } } } getInetAddress()得到ip地址的超集,包含ip地址也可以包括其他的地址。 .getPort() 得到端口号。 server端写入到client端。
Client端:
Client端从server端读取:
import java.net.*; import java.io.*; /*1 java Socket编程。 *2 Socket/ServerSocket类用法。 *3 通过Socket对象可以获取通信对方Socket信息。 */ public class TCPClient { public static void main(String[] args) { try { //建立客户端的那个“插座接口”,并且通过构造方法和服务器端的那个接口相连接。 Socket s1 = new Socket("127.0.0.1",8888); //读来自服务器端的数据流。 InputStream is = s1.getInputStream(); //DataInputStream 需要套接在InputStream上。 DataInputSteam dis = new DataInputStream(is); //进行读出来自服务器端的数据流。通过UTF编码读出。 System.out.println(dis.readUTF()); //关闭管道。 dis.close(); //关闭socket接口通信。 s1.close(); }catch(ConnectException connExc)//捕捉到不同的异常进行不同的处理。 { connExc.printStackTrace(); System.err.println("服务器链接失败!"); }catch(IOException e) { e.printStackTrace(): } } }
结果如下:
接通后两端都说都听:
server端:
import java.net.*; //两端都说两端都听,但是要有顺序,这和当时的传呼机感觉类似。 /* 1 java Socket编程步骤。 * 2 Socket/ServerSocker类用法。 * 3 通过Socket对象可以获取通信对方Socket的信息。 * */ 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 //如果读出的不为空的话。向客户单发出本机的ip地址和连接的端口号。 if((s=dis.readUTF())!=null) { System.out.println(s); System.out.println("from:" +socket.getInetAddress()); System.out.println("port: " + socket.getPort()); } //向客户端写入。 dos.writeUTF("hi,hello"); //关闭流对象。 dis.close(); dos.close(); socket.close(); } catch(IOException e) { e.printStackTrace(); System.out.println("程序运行出错:" + e); } } }
Client端:
import java.net.*; import java.io.*; /*1 java Socket编程。 *2 Socket/ServerSocket类用法。 *3 通过Socket对象可以获取通信对方Socket信息。 */ 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("hey"); 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(); } } }
点对点的通信:
就像qq那样同时可以说同时可以听,可以一边说一边听,像打电话一样。
就不在这里列出了。