Java网络编程之TCP通信完整代码示例

 更新时间:2017年12月08日 15:10:32   作者:温布利往事  
这篇文章主要介绍了Java网络编程之TCP通信完整代码示例,具有一定借鉴价值,需要的朋友可以了解下。

一、概述

  Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法会建立和销毁连接,设置各种Socket选项。

  ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象。

二、什么是TCP?  

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通信分为客户端和服务器端,对应的对象是分别是Socket和ServerSocket。

  当一台计算机需要与另一台远程计算机连接时,TCP协议会让他们建立一个连接:用于发送和接收数据的虚拟链路。TCP协议负责收集信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确的还原。为了保证数据包在传送中准确无误,TCP使用了重发机制:当一个通信实体发送一个消息给另一个通信实体后需要收到另一个实体的确认信息,如果没有收到确认信息,则会再次重发刚才发送的信息。

三、TCP通信

  1、构造函数

  Socket类实现客户端套接字,通过构造函数可以指定希望连接的主机和端口。主机可以指定为InetAddress或String,端口始终指定为0到65535之间的int值。

Socket s=new Socket("127.0.0.1", 10001);//创建一个流套接字并将其连接到指定主机上的指定端口号

ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后向请求者返回结果。

ServerSocket ss=new ServerSocket(10001);//创建绑定到特定端口的服务器套接字

2、例子:TCP文件复制

  客户端:

public class ClientDemo
{
	public static void main(String[] args) throws UnknownHostException, IOException
	  {
		Socket s=new Socket("127.0.0.1", 10004);
		BufferedReader buf = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\1.txt"));
		String line=null;
		/*PrintWriter out=new PrintWriter(s.getOutputStream(),true);
    while((line=buf.readLine())!=null)
    {
      out.println(line);
    }
    */
		BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		while((line=buf.readLine())!=null)
		    {
			out.write(line);
			out.newLine();
			out.flush();
		}
		s.shutdownOutput();
		BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String str=in.readLine();
		System.out.println(str);
		s.close();
		buf.close();
	}
}

服务器端:

public class ServerDemo
{
	public static void main(String[] args) throws IOException
	  {
		ServerSocket ss=new ServerSocket(10004);
		Socket s=ss.accept();
		BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line=null;
		/*PrintWriter buf=new PrintWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"),true);
    while((line=in.readLine())!=null)
    {  
      buf.println(line);
    }*/
		BufferedWriter buf=new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"));
		while((line=in.readLine())!=null)
		    {
			buf.write(line);
			buf.newLine();
			buf.flush();
		}
		PrintWriter out=new PrintWriter(s.getOutputStream(),true);
		out.println("传输成功!");
		ss.close();
		buf.close();
	}
}

四、Socket在浏览上的应用

  我们可以在Eclipse中编写服务器端,然后利用浏览器进行访问。

  eg、服务器端代码为:

public class SocketServer
{
  public static void main(String[] args) throws IOException 
  {
    ServerSocket server=new ServerSocket(11000);
    Socket client=server.accept();
    PrintWriter out=new PrintWriter(client.getOutputStream(),true);
    out.println("你好!");
    server.close();
  }
}

然后打开IE浏览器,在地址中输入http://192.168.1.120:11000/(192.168.1.120为本机IP地址),结果显示为

在正常的应用中,浏览器是向Tomacat服务器发出请求,以得到网页图片等资源。而tomca就是用Java写的服务器端软件。

  现在我们编写服务器端为:

public class SocketServer
{
  public static void main(String[] args) throws IOException 
  {
    ServerSocket server=new ServerSocket(11000);
    Socket client=server.accept();
    PrintWriter out=new PrintWriter(client.getOutputStream(),true);
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
    String line=null;
    while((line=in.readLine())!=null)
      System.out.println(line);
    out.println("你好!");
    server.close();
  }
}

然后在利用浏览器访问,可以看到浏览器(客户端)发给服务器端的请求头数据为:

利用上述原理,我们可以自己编写类似IE的浏览器端(客户端)软件。首先在Tomcat的安装目录C:\apache-tomcat-7.0.62\webapps\myweb中添加一个demo.html资源,然后编写客户端,代码如下:

public class ClientDemo
{
	public static void main(String[] args) throws UnknownHostException, IOException
	  {
		Socket s=new Socket("192.168.1.120",8080);
		PrintWriter out=new PrintWriter(s.getOutputStream(),true);
		//将请求头发给服务器
		out.println("GET /myweb/demo.html HTTP/1.1");
		out.println("Accept:*/*");
		out.println("Host: 192.168.1.120:11000");
		out.println("Connection: Keep-Alive");
		//输出空行,此步骤不可少
		out.println();
		BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line=null;
		//返回服务器的响应文件
		while((line=in.readLine())!=null)
		    {
			System.out.println(line);
		}
		s.close();
	}
}

接下来,启动Tomcat。即双击C:\apache-tomcat-7.0.62\bin中startup.bat文件。然后运行上述客户端代码,此时可以看到Tomacat返回的响应数据:

总结

以上就是本文关于Java网络编程之TCP通信完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java网络编程基础篇之单向通信

Java多线程编程实现socket通信示例代码

Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java实现定时任务的示例代码

    Java实现定时任务的示例代码

    这篇文章主要为大家详细介绍了Java实现定时任务的相关知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-11-11
  • SpringBoot的@EnableAsync和@Async注解分析

    SpringBoot的@EnableAsync和@Async注解分析

    这篇文章主要介绍了SpringBoot的@EnableAsync和@Async注解分析,Spring Boot是一个快速开发框架,可以帮助开发人员快速构建基于Spring的应用程序,需要的朋友可以参考下
    2023-07-07
  • 关于logBack配置日志文件及编码配置的问题

    关于logBack配置日志文件及编码配置的问题

    这篇文章主要介绍了logBack配置日志文件及编码配置的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springboot整合Nginx实现负载均衡反向代理的方法详解

    springboot整合Nginx实现负载均衡反向代理的方法详解

    这篇文章主要给大家介绍了关于springboot整合Nginx实现负载均衡反向代理的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文)

    Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文)

    这篇文章主要介绍了Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • IDEA actiBPM插件安装图文教程

    IDEA actiBPM插件安装图文教程

    这篇文章主要介绍了IDEA actiBPM插件安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 关于springboot 配置文件中属性变量引用方式@@解析

    关于springboot 配置文件中属性变量引用方式@@解析

    这篇文章主要介绍了关于springboot 配置文件中属性变量引用方式@@解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Java多线程编程之读写锁ReadWriteLock用法实例

    Java多线程编程之读写锁ReadWriteLock用法实例

    这篇文章主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下
    2015-05-05
  • 通过Java添加Word文本框过程详解

    通过Java添加Word文本框过程详解

    这篇文章主要介绍了通过Java添加Word文本框过程详解,在Word中,文本框是指一种可移动、可调节大小的文字或图形容器。我们可以向文本框中添加文字、图片、表格等对象,下面,将通过Java编程来实现添加以上对象到Word文本框,需要的朋友可以参考下
    2019-07-07
  • Java源码解析之超级接口Map

    Java源码解析之超级接口Map

    今天给各位小伙伴介绍一下超级接口Map,文中对接口Map讲的非常详细,对正在学习java的小伙伴们有很好的帮助哟,需要的朋友可以参考下
    2021-05-05

最新评论