59、socket通讯

学习目标:

1、了解Socket的概念

2、掌握Socket服务器端和客户端开发

学习过程:

一、socket通讯

套接字(Socket)表示一个系统的IP地址和端口号的结合,是两台机器间通信的端点,用来处理两个流对象,通讯方式抽象成为流的方式。

通讯的两台计算机,一台担任服务器,一台担任客户机,服务器监听客户机是否连接。java.net.ServerSocket和java.net.Socket两个类用于建立一个双边的通信。ServerSocket类实现服务器,等待来自客户端的连接;Socket连接到一个服务器端,担任客户机。

attcontent/2f7d77c8-4312-4f92-a1e6-8e42d98099bb.png

创建TCP Socket需要的四个信息:

本地系统的IP

本地应用程序使用的TCP端口号

服务器系统的IP

服务器应用程序相应的TCP端口号

1、ServerSocket类

ServerSocket类用于侦听一个客户端的Socket连接,如果没有连接,它将一直等待。ServerSocket构造方法介绍如下:

ServerSocket(int port):用指定的端口port来创建一个侦听Socket,

ServerSocket(int port,int backlog):加上一个用来改变连接队列长度的参数backlog。

ServerSocket(int port,int backlog,InetAddress localAddr):在机器存在多个IP地址的情况下,允许通过localAddr这个参数来指定侦听的IP地址。

常用方法:

Socket accept():等待客户机的连接,并返回对应的Socket。

close():关闭连接。

bind(SocketAddress endpoint):将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 

bind(SocketAddress endpoint, int backlog):将 ServerSocket 绑定到特定地址(IP 地址和端口号)。    

2、Socket类

Socket类常用构造器:

Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket常用方法:

getInputStream():返回此套接字的输入流。

getOutputStream():返回此套接字的输出流。

close():关闭此套接字。

getLocalAddress():获取套接字绑定的本地地址。

getLocalPort():返回此套接字绑定到的本地端口。

二、示例代码

1、服务器端代码。新建一个Server类,实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

 /**

 * 服务器

 

 * @author Administrator

 

 */

public class Server {

    public static void main(String[] args) throws IOException {

        // 构造服务器端的soucket,监听端口

        ServerSocket serverSocket = new ServerSocket(6001);

        System.out.println("服务器启动,等待客户端的链接...");

        // 程序在此定下来,等待客户端的链接

        Socket socket = serverSocket.accept();

         

        System.out.println("地址:"+socket.getLocalAddress());

        // 发送一条信息给客户端

        PrintWriter pw = new PrintWriter(new BufferedWriter(

                new OutputStreamWriter(socket.getOutputStream())));

        pw.println("hi , 我是服务器端!!!");

        pw.flush();

        // 接受客户端端发送的信息

        BufferedReader in = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

         

        String temp=in.readLine();

         

        System.out.println("客户端发来的信息:"+temp);

         

        pw.close();

        in.close();

        socket.close();

        serverSocket.close();

    }

}

该程序运行到accept会停下来,等待客户机的连接,有客户机连接后,程序就会往下运行,先给客户及发送一条信息,然后再获得客户机发送过来的信息。最后关闭所有资源

2、客户端代码。客户机相对比较简单,就是连接服务器,然后接受服务器的信息,并向服务器发送一条信息。大家在运行我们这段代码时,需要把IP地址换成你电脑的IP地址。实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public class Client {

    public static void main(String[] args) throws IOException {

        // 指定ip和端口

        Socket socket = new Socket(InetAddress.getByName("192.168.11.144"),

                6001);

        // 接受服务器发来的信息

        BufferedReader br = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

        System.out.println("服务端发来的信息:" + br.readLine());

        // 发送一条信息给服务器

        PrintWriter pw = new PrintWriter(new BufferedWriter(

                new OutputStreamWriter(socket.getOutputStream())));

         

        pw.println("我是客户端");

         

        pw.flush();

         

        pw.close();

        br.close();

        socket.close();

    }

}

3、测试

如果在MyEclipse的控制台测试不够直观的话,你也可以在Dos控制台中测试。先把这两个文件复制到D:盘中,使用javac命名编译成为字节码。

1、在运行中输入cmd,打开DOS控制台,编译源码。

attcontent/11a3c189-bd73-4aa5-9e05-889639ec3b04.png

2、先运行服务类。

attcontent/a7185253-a13b-4898-bb62-ca861fe25860.png

3、再次在运行中输入cmd,打开另外一个Dos控制,运行客户机类。

attcontent/78cc871b-5bdb-4f13-9853-fa907e8281ce.png

两个控制台之间使用Socket实现了通讯,如果你有两台计算机也可以在两台计算机之间实现通讯。

三、实例

把客户机C:/abc.txt文本通过socket发送给服务机,并保存在服务机的D:盘中。

1、服务器端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

 public class FileServer {

    public static void main(String[] args) throws IOException {

        BufferedWriter bw = new BufferedWriter(new FileWriter("d://abc.txt"));

        // 构造服务器端的soucket,监听端口

        ServerSocket serverSocket = new ServerSocket(6001);

        System.out.println("服务器启动,等待客户端的链接...");

        // 程序在此定下来,等待客户端的链接

        Socket socket = serverSocket.accept();

        // 从客户端读取信息

        BufferedReader in = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

        String temp = in.readLine();

        while (temp != null) {

            System.out.println("客户端发来的信息:" + temp);

            // 写入硬盘

            bw.write(temp + "\r\n");

            temp = in.readLine();

        }

        in.close();

        bw.flush();

        bw.close();

        socket.close();

        serverSocket.close();

    }

}

2、客户端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class FileClient {

    public static void main(String[] args) throws UnknownHostException,

            IOException {

        // 读取硬盘文件

        BufferedReader br = new BufferedReader(new FileReader("c://abc.txt"));

        // 把文件写到服务器

        // 指定ip和端口

        Socket socket = new Socket(InetAddress.getByName("192.168.11.144"),

                6001);

        // 发送一条信息给服务器

        PrintWriter pw = new PrintWriter(new BufferedWriter(

                new OutputStreamWriter(socket.getOutputStream())));

        String temp = br.readLine();

        while (temp != null) {

            pw.println(temp);

            temp = br.readLine();

        }

        pw.close();

        socket.close();

    }

}

你可以在两台电脑之间运行,记得修改客户端的IP地址就可以了。当然你也可以只在本机上面测试,但是现在不同我们之前学习IO时候的简单的复制,而是通过网络传输了。

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/83753413
今日推荐