java 服务器端与客户端_java的服务端与客户端通信(1)

本文详细介绍了Java Socket的基本概念,包括套接字的定义、重要类及其方法,如ServerSocket和Socket的使用。通过实例展示了客户端和服务端如何进行通信,以及通信流程图。适合初学者理解Socket通信原理和实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、理解socket

1.1什么是socket?

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。

1.2重要的socket

java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法:

1.accept方法

用于产生"阻塞",直到接收到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

2.getInputStream方法

连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

3.getOutputStream方法

连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

1.3Socket通信原理

服务器:使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的动态的分配一个1024以上的端口。

ServerSocket类

ServerSocket myListener = new ServerSocket(600);

提供监听服务的端口是600,不同服务之间通过端口来区别。为了随时监听可能的Client端的请求,执行如下语句:

Socket linkSockt = myListener.accept();这个方法执行将使得Server端处于等待状态,直到接收一个来自Client端的请求,并返回一个与Client通信的Socket对象。

Server端与Client端连接后,就实现了相互读写数据,结束通信执行:

myListener.close();

Socket类

Client需从Server获取服务时,应创建一个Socket对象:

Socket mySocket = new Socket(host,port);

连通后,利用Socket类方法getOutputStream()获取(write)输出流,和getInputStream()获取(read)输入流。结束通信同样是

mySocket.close();

ServerSocket一般仅用于设置端口号和监听,真正进行通信的是Server端的Socket与Client端的Socket,在ServerSocket进行accept后,就将主动权转让给Server端的Socket。

二、socket编程范例及运行过程!

流程图如下:

263eb1219f419b5eb3dff107f414a984.png

客户端代码:

1 import java.net.Socket;

2 import java.io.InputStream;

3 import java.io.OutputStream;

4 import java.io.PrintWriter;

5 import java.io.BufferedReader;

6 import java.io.InputStreamReader;

7 import java.io.IOException;

8 import java.net.UnknownHostException;

9

10 public class ClientText {

11

12 public static final String ip="127.0.32.42";

13 public static int port=7890;

14 private Socket client_s;

15

16 public ClientText(){

17 try{

18 client_s=new Socket(ip,port);

19 }catch(UnknownHostException e){

20 e.printStackTrace();

21 }catch(IOException c){

22 c.printStackTrace();

23 }

24 }

25

26 public void setConnection() throws IOException{

27 InputStream is;

28 OutputStream os;

29 try{

30 is=client_s.getInputStream();

31 os=client_s.getOutputStream();

32 BufferedReader sys_br=new BufferedReader(new InputStreamReader(System.in));

33 BufferedReader client_br=new BufferedReader(new InputStreamReader(is));

34 PrintWriter client_pw=new PrintWriter(os,true);

35 String warnStr=null;

36 if((warnStr=client_br.readLine())!=null){

37 System.out.println(warnStr);

38 }

39 while((warnStr=sys_br.readLine())!=null){

40 client_pw.println(warnStr);

41 break;

42 }

43 }catch(IOException e){

44 e.printStackTrace();

45 }

46 }

47

48 public static void main(String[] args) {

49 // TODO 自动生成的方法存根

50 ClientText myclient=new ClientText();

51 try {

52 myclient.setConnection();

53 } catch (IOException e) {

54 // TODO 自动生成的 catch 块

55 e.printStackTrace();

56 }

57 }

58

59 }

服务端代码:

1 import java.io.IOException;

2 import java.net.ServerSocket;

3 import java.net.Socket;

4 import java.io.InputStream;

5 import java.io.OutputStream;

6 import java.io.InputStreamReader;

7 import java.io.PrintWriter;

8 import java.io.BufferedReader;

9

10 public class ServerText{

11

12 private ServerSocket ss;

13 public static final int port=7890;

14

15 public ServerText(){

16 try{

17 ss=new ServerSocket(port);

18 }catch(IOException e){

19 e.printStackTrace();

20 }

21 }

22

23 public void setConnection()throws IOException{

24 Socket server_s;

25 OutputStream os;

26 InputStream is;

27 try{

28 //服务器程序陷入阻塞状态,随时接受客户端的链接

29 server_s=ss.accept();

30 //接收并连接之后

31 os=server_s.getOutputStream();

32 is=server_s.getInputStream();

33 //给客户端发送数据

34 PrintWriter server_pw=new PrintWriter(os,true);

35 //接收客户端的数据

36 BufferedReader server_br=new BufferedReader(new InputStreamReader(is));

37 String msg=null;

38 server_pw.println("连接成功,请输入一些数据传递到服务端");

39 if((msg=server_br.readLine())!=null){

40 System.out.println("客户端传递过来的数据为:"+msg);

41 server_pw.println("数据传输成功");

42 }else{

43 server_pw.println("数据传输失败,出现错误");

44 }

45 }catch(IOException e){

46 e.printStackTrace();

47 }

48 }

49

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

51 ServerText server_text=new ServerText();

52 server_text.setConnection();

53

54 }

55 }

运行结果:

客户端:

b19b1a8b2dd1bfa9596d267ef7de920b.png

服务端:

ebff9ff6b4b8027fb6a3c9450af7a6a2.png

以上就是简单的socket的通信过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值