Java网络编程之TCP通信完整代码示例
作者:温布利往事 发布时间:2022-10-18 21:42:57
一、概述
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网络编程基础篇之单向通信
Java多线程编程实现socket通信示例代码
Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
来源:https://www.cnblogs.com/xujian2014/p/4660570.html
猜你喜欢
- 嗯,就是BASE64,不用多想,本来计划是要跟上一篇字符串压缩一起写的,用来实现将一个文件可以用json或者text等方式进行接口之间的传输
- 委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。同步调用的例子:
- 原始Spring开发Person.java准备Person.java类:package com.jektong.spring;public
- 序言for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用。for循环语句的语法格式如下:java语言 for
- MyBatis插入Insert、InsertSelective的区别逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分
- 集合定义集合,集合是java中提供的一种容器,可以用来存储多个数据。特点:数组的长度是固定的。集合的长度是可变的。集合中存储的元素必须是引用
- JenkinsJenkins是一个开源的、可扩展的持续集成、交付、部署的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台
- 本博文将为您提供自Java 7以来增加的很棒的新功能的示例。我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java
- 为什么要用Flyway在日常开发中,我们经常会遇到下面的问题:自己写的SQL忘了在所有环境执行;别人写的SQL我们不能确定是否都在所有环境执
- 1 前言到目前为止Java仍然是使用最多的编程语言,随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,
- 何为原子性原子性:一条线程在执行一系列程序指令操作时,该线程不可中断。一旦出现中断,那么就可能会导致程序执行前后的结果不一致。与数据库中的原
- 一、数组创建1.1 声明并赋值int[] a = {1,2,3};1.2 声明数组名开辟空间并且赋值int[] a;a = new int[
- 1.基本概念首先我们需要弄清楚几个概念:面向对象是什么、类是什么、对象又是什么?还是逐个来说1.1面向对象我们常说Java是面向对象的语言,
- 本文实例讲述了java 线程方法join简单用法。分享给大家供大家参考,具体如下:虽然关于讨论线程join方法的博客已经很多了,不过个人感觉
- 在java中我们常常使用加锁机制来确保线程安全,但是如果过度使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,
- 简介JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。JSON Web Token 入门教程 这篇文章可以帮你了解
- 首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm项目规划,2个服务端
- Mybatis-Spring当我们使用mybatis和spring整合后为什么下面的代码可以运行?一个问题:我就写了个mapper接口为什么
- 在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类!
- Spring Bean的生命周期?首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;Sp