1.socket简介:
socket通常称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定在一个端口上,不同的端口对应不同的服务。
应用程序通常通过"套接字",向网络发出请求或者应答网络请求。socket和serverSocket类位于java.net包中。serverScoket用于服务端,socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。
2.获取地址和端口号:
通过socket可以获取获取本地地址和端口号,以及远程地址和端口号。
服务器端源码:
1 package socket; 2 3 import java.net.InetAddress; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class Server { 8 public static void main(String[] args) throws Exception { 9 //创建serverSocket,并申请8080端口 10 ServerSocket ss = new ServerSocket(8080); 11 //阻塞方法,直到某个Socket连接。连接成功,产生Socket实例。 12 Socket s = ss.accept(); 13 int localPort = s.getLocalPort();//获取本地端口 14 InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP 15 String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 16 String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 17 System.out.println("本地端口为:"+localPort); 18 System.out.println("本地IP地址的完全限定域名:"+hostName); 19 System.out.println("本地IP的字符串为:"+hostAddress); 20 System.out.println("*************分割符*****************"); 21 int port = s.getPort();//获取远程端使用的端口 22 InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP 23 String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 24 String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 25 System.out.println("远程端口为:"+port); 26 System.out.println("远程IP地址的完全限定域名"+inetName); 27 System.out.println("远程IP的字符串为"+inetAddress); 28 } 29 }
客服端代码:
1 package socket; 2 3 import java.net.InetAddress; 4 import java.net.Socket; 5 6 public class Client { 7 public static void main(String[] args) throws Exception { 8 //连接的主机名为"localhost",连接到的主机8080端口。 9 Socket s = new Socket("192.168.1.103",8080); 10 int localPort = s.getLocalPort();//获取本地端口 11 InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP 12 String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 13 String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 14 System.out.println("本地端口为:"+localPort); 15 System.out.println("本地IP地址的完全限定域名:"+hostName); 16 System.out.println("本地IP的字符串为:"+hostAddress); 17 System.out.println("*************分割符*****************"); 18 int port = s.getPort();//获取远程端使用的端口 19 InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP 20 String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 21 String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 22 System.out.println("远程端口为:"+port); 23 System.out.println("远程IP地址的完全限定域名"+inetName); 24 System.out.println("远程IP的字符串为"+inetAddress); 25 } 26 }
注意:要先开服务器,再开客户端。可以用浏览器代替客户端,因为http协议是基于tcp/ip协议的。
3.获取网络的输入和输出流
服务器源码:
1 package socket; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.io.PrintWriter; 9 import java.net.InetAddress; 10 import java.net.ServerSocket; 11 import java.net.Socket; 12 13 public class Server { 14 public static void main(String[] args) throws Exception { 15 //创建serverSocket,并申请8080端口 16 ServerSocket ss = new ServerSocket(8080); 17 //阻塞方法,直到某个Socket连接。连接成功,产生Socket实例。 18 Socket s = ss.accept(); 19 System.out.println("有客户端进入:"); 20 int localPort = s.getLocalPort();//获取本地端口 21 InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP 22 String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 23 String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 24 System.out.println("本地端口为:"+localPort); 25 System.out.println("本地IP地址的完全限定域名:"+hostName); 26 System.out.println("本地IP的字符串为:"+hostAddress); 27 System.out.println("*************分割符*****************"); 28 int port = s.getPort();//获取远程端使用的端口 29 InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP 30 String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 31 String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 32 System.out.println("远程端口为:"+port); 33 System.out.println("远程IP地址的完全限定域名"+inetName); 34 System.out.println("远程IP的字符串为"+inetAddress); 35 InputStream is = s.getInputStream();//获取字节输入流 36 OutputStream os = s.getOutputStream();//获取字节输出流 37 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));//将字节流按照charset解析为字符,然后从字符流中读取文本 38 PrintWriter writer = new PrintWriter(new OutputStreamWriter(os,"utf-8"));//将文本行转换为字符,按照charset解析为字符流 39 writer.println("你好,客户端!");//向客服端发送消息 40 writer.flush();//刷新该流的缓冲 41 String str =reader.readLine();//读取客服端发送的消息 42 System.out.println("客户端说:"+str); 43 s.close();//关闭socket,释放系统资源 44 } 45 }
客户端源码:
1 package socket; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.io.PrintWriter; 9 import java.net.InetAddress; 10 import java.net.Socket; 11 12 public class Client { 13 public static void main(String[] args) throws Exception { 14 //连接的主机名为"localhost",连接到的主机8080端口。 15 Socket s = new Socket("192.168.1.103",8080); 16 int localPort = s.getLocalPort();//获取本地端口 17 InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP 18 String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 19 String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 20 System.out.println("本地端口为:"+localPort); 21 System.out.println("本地IP地址的完全限定域名:"+hostName); 22 System.out.println("本地IP的字符串为:"+hostAddress); 23 System.out.println("*************分割符*****************"); 24 int port = s.getPort();//获取远程端使用的端口 25 InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP 26 String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名 27 String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。 28 System.out.println("远程端口为:"+port); 29 System.out.println("远程IP地址的完全限定域名"+inetName); 30 System.out.println("远程IP的字符串为"+inetAddress); 31 InputStream is = s.getInputStream();//获取字节输入流 32 OutputStream os = s.getOutputStream();//获取字节输出流 33 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));//将字节流按照charset解析为字符,然后从字符流中读取文本 34 PrintWriter writer = new PrintWriter(new OutputStreamWriter(os,"utf-8"));//将文本行转换为字符,按照charset解析为字符流 35 String str = reader.readLine();//接受服务器发送的信息 36 System.out.println("服务器说:"+str); 37 writer.println("服务器,你好!");//向服务器发送信息 38 writer.flush();//刷新该流的缓冲 39 s.close();//关闭socket,释放系统资源 40 } 41 }