一、概述

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返回的响应数据:

转载自:http://www.cnblogs.com/xujian2014/p/4660570.html

java 网络执行_Java网络编程之TCP通信相关推荐

  1. 2-4:套接字(Socket)编程之TCP通信

    文章目录 一 TCP通信服务端和客户端--和UDP区别 (1)服务端 (2)客户端 二:TCP通信-多进程/线程 (1)多进程版本 (2)多线程版本 (3)线程池版本 一 TCP通信服务端和客户端-- ...

  2. 嵌入式学习之QT学习---8 QT网络编程之TCP通信

    前言: Qt网络模块提供了用于编写TCP/IP客户端和服务器端程序的各种类,如用于TCP通信的QTcpSocket和QTcpServer,用于UDP通信的QUdpSocket,还有用于实现HTTP.F ...

  3. Python网络编程之TCP通信实例和socketserver框架使用例子

    http://www.jb51.net/article/49359.htm 转载于:https://blog.51cto.com/duallay/1681062

  4. java并发编程_Java并发编程之 synchronized

    大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...

  5. java futuretask 状态_java并发编程之FutureTask

    引言 FutureTask实现了接口Future,同Future一样,代表异步计算的结果.当然,FutureTask除了实现Future接口之外,还实现了Runnable接口,所以,FutureTas ...

  6. python界面编程和网口通信_Python—网络通信编程之tcp通信编程

    服务端代码 import socket # 1.创建流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, ...

  7. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  8. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...

  9. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  10. Centos网络编程之tcp十一种状态及问题处理办法

    尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...

最新文章

  1. 人工智能帮助预测混合用药的副作用
  2. QT数据库使用案列【联系人】-- 使用sqlite和QStringListModel
  3. CentOS 7常用命令
  4. access期刊可以重投几次_又被拒稿了?老司机带你一投即中
  5. 击中-击不中变换(约束)—lhMorpHMTC
  6. 用高精度方法计算n! ,并显示n!(阶乘)的值。
  7. windows部署免安装版python
  8. Checkpoint--实现步骤
  9. JAVA发布栅格图层_基于 WebGL实现自定义栅格图层踩坑实录
  10. java jackson unicode_如何让Jackson JSON生成的数据包含的中文以unicode方式编码
  11. 5G技术对大数据产业的影响
  12. kafka是什么_Kafka为什么快到根本停不下来?
  13. Linux下使用源码包安装禅道
  14. 硬件系列(五)-------------Android小票打印机连接 (已封装好,可直接使用)
  15. 项目记录-手机号码限制频次
  16. mysql 手机号省份_根据手机号 判断省份和运营商
  17. 什么是Websocket以及Nginx实现ws代理
  18. 关于Docker入门的一些事(4)
  19. 美国通胀大幅下降?可衰退却成为投资者2023年最担心的问题
  20. zbb20180913 java thread volatile与synchronized区别

热门文章

  1. oracle一次性说清楚,多种分隔符的一个字段拆分多行,再多行多列多种分隔符拆多行,最终处理超亿亿。。亿级别数据量
  2. 如何进行网站流量分析(二)
  3. 利用账号密码模拟登录新浪微博
  4. spring boot电影院售票与管理系统 毕业设计源码论文+答辩PPT
  5. 【思维题】Bazinga
  6. Android视频播放器开发
  7. dgen模拟器 linux,怎么样在Linux/FreeBSD下玩模拟器游戏
  8. 人民网首届内容科技大赛 视界云荣膺三甲晋级决赛
  9. 使用gcov和lcov测试代码覆盖率
  10. 双塔模型的瓶颈,究竟在哪?