java网络编程之socket网络编程示例(服务器端/客户端)

 更新时间:2014年01月22日 16:30:12   作者:  
这篇文章主要介绍了java socket网络编程的示例,分为服务器端和客户端,大家参考使用吧

Java为TCP协议提供了两个类,分别在客户端编程和服务器端编程中使用它们。在应用程序开始通信之前,需要先创建一个连接,由客户端程序发起;而服务器端的程序需要一直监听着主机的特定端口号,等待客户端的连接。在客户端中我们只需要使用Socket实例,而服务端要同时处理ServerSocket实例和Socket实例;二者并且都使用OutputStream和InpuStream来发送和接收数据。

学习一种知识最好的方式就是使用它,通过前面的笔记,我们已经知道如何获取主机的地址信息,现在我们通过一个简单的程序来初步学习传输层使用了TCP协议的Socket编程。

TCP服务器端

在Socket编程中,服务器端远比客户端要复杂得多。服务器端的工作就是建立一个通信终端,被动的等待客户端的连接。下面这个服务器端程序的示例的作用是:监听从控制台输入获取的端口号,并且将客户端发送过来的消息,再发送回去。

复制代码 代码如下:

importjava.net.*;
importjava.text.MessageFormat;
importjava.io.*;

publicclassTCPEchoServer{

privatestaticfinalintBUFSIZE=32;

publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
    //从控制台获取需要监听的端口号
if(args.length!=1)
thrownewIllegalArgumentException("Parameter(s):<Port>");
//获取端口号
intservPort=Integer.parseInt(args[0]);
//实例化一个ServerSocket对象实例
ServerSocketservSocket=newServerSocket(servPort);
System.out.println(MessageFormat.format("开始启动监听,端口号:{0}",args[0]));

//初始接收数据的总字节数
intrecvMsgSize;
//接收数据的缓冲区
byte[]receiveBuf=newbyte[BUFSIZE];

//循环迭代,监听端口号,处理新的连接请求
while(true){
//阻塞等待,每接收到一个请求就创建一个新的连接实例
SocketclntSocket=servSocket.accept();
//获取连接的客户端的SocketAddress
SocketAddressclientAddress=clntSocket.getRemoteSocketAddress();
//打印输出连接客户端地址信息
System.out.println("Handlingclientat"+clientAddress);
//从客户端接收数据的对象
InputStreamin=clntSocket.getInputStream();
//向客户端发送数据的对象
OutputStreamout=clntSocket.getOutputStream();
//读取客户端发送的数据后,再发送到客户端
while((recvMsgSize=in.read(receiveBuf))!=-1){
out.write(receiveBuf,0,recvMsgSize);
}
//客户端关闭连接时,关闭连接
System.out.println("客户端关闭连接");
clntSocket.close();
}
}
}


TCP客户端

在Socket编程中,首先客户端需要向服务器端发送,然后被动的等待服务器端的响应。下面的示例中:我们向服务器端发送信息,等待服务器端发送的消息,并打印显示出来。 

复制代码 代码如下:

importjava.io.*;
importjava.net.Socket;
importjava.net.SocketException;

publicclassTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
//TODOAuto-generatedmethodstub
    //判断从控制台接受的参数是否正确
if((args.length<2)||(args.length>3))
thrownewIllegalArgumentException(
"Parameter(s):<Server><Word>[<Port>]]");
//获取服务器地址
Stringserver=args[0];
//获取需要发送的信息
byte[]data=args[1].getBytes();
//如果有三个从参数那么就获取发送信息的端口号,默认端口号为8099
intservPort=(args.length==3)?Integer.parseInt(args[2]):8099;
//根据服务器地址和端口号实例化一个Socket实例
Socketsocket=newSocket(server,servPort);
System.out.println("Connectedtoserver...sendingechostring");
//返回此套接字的输入流,即从服务器接受的数据对象
InputStreamin=socket.getInputStream();
//返回此套接字的输出流,即向服务器发送的数据对象
OutputStreamout=socket.getOutputStream();
//向服务器发送从控制台接收的数据
out.write(data);
//接收数据的计数器,将写入数据的初始偏移量
inttotalBytesRcvd=0;
//初始化接收数据的总字节数
intbytesRcvd;
while(totalBytesRcvd<data.length){
//服务器关闭连接,则返回-1,read方法返回接收数据的总字节数
if((bytesRcvd=in.read(data,totalBytesRcvd,data.length
-totalBytesRcvd))==-1)
thrownewSocketException("与服务器的连接已关闭");
totalBytesRcvd+=bytesRcvd;
}
//打印服务器发送来的数据
System.out.println("Received:"+newString(data));
//关闭连接
socket.close();
}
}

首先运行服务器端,监听8099端口:

接着运行客户端程序,并且向服务器端发送消息:

再次查看我们的服务器端控制台,我们可以看到前面客户端连接的地址信息:

相关文章

  • AsyncHttpClient IOExceptionFilter异常过滤器

    AsyncHttpClient IOExceptionFilter异常过滤器

    这篇文章主要为大家介绍了AsyncHttpClient IOExceptionFilter异常过滤器代码流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • springboot中的dockerfile使用

    springboot中的dockerfile使用

    这篇文章主要介绍了springboot中的dockerfile使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 探究实现Aware接口的原理及使用

    探究实现Aware接口的原理及使用

    这篇文章主要为大家介绍了探究实现Aware接口的原理及使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Spring存储与读取Bean对象方法

    Spring存储与读取Bean对象方法

    在Spring中,要想更简单的存储和读取对象的核心是使用注解,这篇文章主要给大家介绍了关于Spring如何通过注解存储和读取对象的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Spring Data JPA 映射VO/DTO对象方式

    Spring Data JPA 映射VO/DTO对象方式

    这篇文章主要介绍了Spring Data JPA 映射VO/DTO对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot 整合Mybatis-Plus并输出SQL日志示例详解

    SpringBoot 整合Mybatis-Plus并输出SQL日志示例详解

    这篇文章主要介绍了SpringBoot整合Mybatis-Plus并输出SQL日志,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Spring Security OAuth Client配置加载源码解析

    Spring Security OAuth Client配置加载源码解析

    这篇文章主要为大家介绍了Spring Security OAuth Client配置加载源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解

    Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解

    这篇文章主要给大家介绍了关于Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • SpringBoot中获取微信用户信息的方法

    SpringBoot中获取微信用户信息的方法

    这篇文章主要介绍了SpringBoot中获取微信用户信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java Socket通信(一)之客户端程序 发送和接收数据

    Java Socket通信(一)之客户端程序 发送和接收数据

    对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容,Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容
    2016-03-03

最新评论