初识Socket通信:基于TCP和UDP协议学习网络编程

Posted 滕秋宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Socket通信:基于TCP和UDP协议学习网络编程相关的知识,希望对你有一定的参考价值。

学习笔记:

1.基于TCP协议的Socket网络编程:

  (1)Socket类构造方法:在客户端和服务器端建立连接

    Socket s = new Socket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象。

    Socket s = new Socket(address,port);以InetAddress对象和端口号作为参数来创建一个Socket对象。

  创建Socket对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。

  (2)常用方法

    InetAddress getInetAddress();返回与Socket对象关联的InetAddress

    int getPort();远程端口

    int getLocalPort();本地端口

    InputStream getInputStream();相关联的InputStream

    OutputStream getOutputStream();相关联的OutputStream

    void close();关闭该Socket

 

  (3)ServerSocket类:等待客户端建立连接,连接以后进行通信

    ServerSocket ss = new ServerSocket(port);接收端口号作为参数

    ServerSocket ss = new ServerSocket(port,maxqueue);接收端口号和最大队列长度作为参数。

 

    accept();等待客户端触发通信

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 /**
10  * 使用Socket变成实现用户登录
11  * 1.实现单用户登录
12  * 2.服务器端关键代码
13  * @author Administrator
14  *
15  */
16 public class Test0101 {
17 
18     public static void main(String[] args) {
19         try {
20             //创建一个服务器Socket(ServerSocket),指定端口8800并开始监听
21             ServerSocket serverSocket = new ServerSocket(8800);
22             //使用accept()方法等待客户端触发通信
23             Socket socket = serverSocket.accept();
24             //打开输入/输出流
25             InputStream is = socket.getInputStream();
26             OutputStream os = socket.getOutputStream();
27             //获取客户端信息,即从输入流读取信息
28             BufferedReader br = new BufferedReader(new InputStreamReader(is));
29             String info = null;
30             while(!((info = br.readLine())==null)){
31                 System.out.println("我是服务器,客户登录信息为:"+info);
32             }
33             socket.shutdownInput();
34             //给客户端一个响应,即向输出流写入信息
35             String reply = "欢迎你,登陆成功!";
36             os.write(reply.getBytes());
37             os.close();
38             br.close();
39             is.close();
40             socket.close();
41             serverSocket.close();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45     }
46 
47 }
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.net.Socket;
 7 import java.net.UnknownHostException;
 8 
 9 /**
10  * 使用Socket变成实现用户登录
11  * 1.实现单用户登录
12  * 2.客户端关键代码
13  * @author Administrator
14  *
15  */
16 public class Test01 {
17 
18     public static void main(String[] args) {
19         try {
20             //建立客户端Socket连接,指定服务器的位置为本机以及端口8800
21             Socket socket = new Socket("127.0.0.1",8800);
22             //打开输入/输出流
23             OutputStream os = socket.getOutputStream();
24             InputStream is = socket.getInputStream();
25             //发送客户端登录信息,即向输出流写入信息
26             String info = "用户名:Tom;用户密码:123456";
27             os.write(info.getBytes());
28             socket.shutdownOutput();
29             //接受服务器端的响应,即从输入流读取信息
30             String reply = null;
31             BufferedReader br = new BufferedReader(new InputStreamReader(is));
32             while(!((reply = br.readLine())==null)){
33                 System.out.println("我是客户端,服务器端的响应为:"+reply);
34             }
35             //关闭资源
36             br.close();
37             is.close();
38             os.close();
39             socket.close();
40         } catch (UnknownHostException e) {
41             e.printStackTrace();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45         
46     }
47 
48 }
 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.ObjectInputStream;
 4 import java.io.OutputStream;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 /**
 9  * 服务器端关键代码
10  * @author Administrator
11  *
12  */
13 public class Test0201 {
14 
15     public static void main(String[] args) {
16         try {
17             //创建一个服务器Socket(ServerSocket)连接,指定端口并开始监听
18             ServerSocket serverSocket = new ServerSocket(8800);
19             //使用accpet()方法等待客户端触发通信
20             Socket socket = serverSocket.accept();
21             //打开输入输出流
22             InputStream is = socket.getInputStream();
23             OutputStream os = socket.getOutputStream();
24             //反序列化
25             ObjectInputStream ois = new ObjectInputStream(is);
26             //获取客户端信息(从输入流读取信息)
27             User user = (User)ois.readObject();
28             if (!(user==null)) {
29                 System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
30             }
31             //给客户端一个响应(向输出流写入信息)
32             String reply = "欢迎你,登陆成功!";
33             os.write(reply.getBytes());
34             //关闭资源
35             os.close();
36             ois.close();
37             is.close();
38             socket.close();
39             serverSocket.close();
40         } catch (ClassNotFoundException e) {
41             e.printStackTrace();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45 
46     }
47 
48 }
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.ObjectOutputStream;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * 客户端关键代码
12  * @author Administrator
13  *
14  */
15 public class Test02 {
16 
17     public static void main(String[] args) {
18         try {
19             //建立客户端Socket连接,指定服务器的位置和端口
20             Socket socket = new Socket("127.0.0.1",8800);
21             //打开输入输出流
22             OutputStream os = socket.getOutputStream();
23             InputStream is = socket.getInputStream();
24             //对象序列化
25             ObjectOutputStream oos = new ObjectOutputStream(os);
26             //发送客户端登录信息(向输出流写入数据)
27             User user = new User();
28             user.setLoginName("Tom");
29             user.setPwd("12345678");
30             oos.writeObject(user);
31             socket.shutdownOutput();
32             //接收服务器端的响应(从输入流读取信息)
33             String reply = null;
34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
35             while(!((reply = br.readLine())==null)){
36                 System.out.println("我是客户端,服务器端的响应为"+reply);
37             }
38             //关闭资源
39             br.close();
40             oos.close();
41             is.close();
42             os.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49 
50     }
51 
52 }

案例:实现多客户端用户登录

1.登录线程类

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.ObjectInputStream;
 4 import java.io.OutputStream;
 5 import java.net.Socket;
 6 
 7 /**
 8  * 登录线程类
 9  * @author Administrator
10  *
11  */
12 public class LoginThread extends Thread {
13     Socket socket = null;
14     //每启动一个线程,连接对应的Socket接口
15     public LoginThread(Socket socket){
16         this.socket = socket;
17     }
18     //启动线程,即响应客户请求
19     public void run(){
20         try {
21             //打开输入输出流
22             InputStream is = socket.getInputStream();
23             OutputStream os = socket.getOutputStream();
24             //反序列化
25             ObjectInputStream ois = new ObjectInputStream(is);
26             //获取客户端信息(从输入流读取信息)
27             User user = (User)ois.readObject();
28             if (!(user==null)) {
29                 System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
30             }
31             //给客户端一个响应(向输出流写入信息)
32             String reply = "欢迎你,登陆成功!";
33             os.write(reply.getBytes());
34             //关闭资源
35             os.close();
36             ois.close();
37             is.close();
38             socket.close();
39         } catch (ClassNotFoundException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 
46 }

2.服务器端的响应

 1 import java.io.IOException;
 2 import java.net.ServerSocket;
 3 import java.net.Socket;
 4 
 5 /**
 6  * 服务器端关键代码
 7  * @author Administrator
 8  *
 9  */
10 public class Test0301 {
11 
12     public static void main(String[] args) {
13         try {
14             //创建一个服务器Socket(ServerSocket),指定端口并开始监听
15             @SuppressWarnings("resource")
16             ServerSocket serverSocket = new ServerSocket(8800);
17             //使用accpet()方法等待客户端触发通信
18             Socket socket = null;
19             while (true) {
20                 //监听一直进行中
21                 socket = serverSocket.accept();
22                 LoginThread login = new LoginThread(socket);
23                 login.start();
24             }
25         } catch (IOException e) {
26             e.printStackTrace();
27         }
28 
29     }
30 
31 }

3.客户登陆

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.ObjectOutputStream;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * 实现多客户端用户登录
12  * @author Administrator
13  *
14  */
15 public class Test03 {
16 
17     public static void main(String[] args) {
18         try {
19             //建立客户端Socket连接,指定服务器的位置和端口
20             Socket socket = new Socket("127.0.0.1",8800);
21             //打开输入输出流
22             OutputStream os = socket.getOutputStream();
23             InputStream is = socket.getInputStream();
24             //对象序列化
25             ObjectOutputStream oos = new ObjectOutputStream(os);
26             //发送客户端登录信息(向输出流写入数据)
27             User user = new User();
28             user.setLoginName("Kate");
29             user.setPwd("12345678");
30             oos.writeObject(user);
31             socket.shutdownOutput();
32             //接收服务器端的响应(从输入流读取信息)
33             String reply = null;
34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
35             while(!((reply = br.readLine())==null)){
36                 System.out.println("我是客户端,服务器端的响应为"+reply);
37             }
38             //关闭资源
39             br.close();
40             oos.close();
41             is.close();
42             os.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49     }
50 
51 }

二、InetAddress类中的工厂方法

  static InetAddress getLocalHost();返回本地主机InetAddress对象

  static InetAddress getByName(String hostName);返回InetAddress对象

  static InetAddress[] getAllByName(String hostName);返回主机名~所有主机对象组

 1 import java.net.InetAddress;
 2 import java.net.UnknownHostException;
 3 
 4 /**
 5  * 获取淘宝网服务器地址
 6  * @author Administrator
 7  *
 8  */
 9 public class Test002 {
10 
11     public static void main(String[] args) {
12         //定义目标网址
13         String target = "localhost";
14         System.out.println("------淘宝的主服务器地址------");
15         InetAddress iad;
16         try {
17             iad = InetAddress.getByName(target);
18             System.out.println(iad);
19         } catch (UnknownHostException e) {
20             e.printStackTrace();
21         }
22         
23         System.out.println("------淘宝的所有服务器地址------");
24         InetAddress[] iads;
25         try {
26             iads = InetAddress.getAllByName(target);
27             System.out.println(target+"的IP地址有"+iads.length+"个,分别是:");
28             for (InetAddress ia : iads) {
29                 System.out.println(ia);
30             }
31         } catch (UnknownHostException e) {
32             e.printStackTrace();
33         }
34 
35     }
36 
37 }

 

以上是关于初识Socket通信:基于TCP和UDP协议学习网络编程的主要内容,如果未能解决你的问题,请参考以下文章

基于TCP与UDP协议的socket通信

82.基于tcp和udp协议的简单通信套接字编程

Java Socket实现基于TCP和UDP多线程通信

基于UDP协议的网络通信应用程序(UDP-Socket)

细说http - tcp - udp - socket - protobuf协议

基于 Socket 的 UDP 和 TCP 编程介绍