Java Socket编程
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那样同时可以说同时可以听,可以一边说一边听,像打电话一样。
就不在这里列出了。

浙公网安备 33010602011771号