一、概述

  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通信的更多相关文章

  1. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. Java网络编程之TCP、UDP

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

  3. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  4. java网络编程之TCP通讯

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

  5. java 网络编程之UDP通信和简单的群聊程序

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. 4.Java网络编程之TCP/UDP

    常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         ...

  7. java网络编程之TCP实例

    Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...

  8. python网络编程之TCP通信实例

    一. server.py import socket host="localhost" port= s=socket.socket(socket.AF_INET,socket.SO ...

  9. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

随机推荐

  1. Python 自定义异常处理Error函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- CODEMSG = { 2000: u"True", 4000: u"客户上传的 ...

  2. can 驱动

    http://www.cnblogs.com/general001/articles/2342728.html http://blog.csdn.net/luoqindong/article/deta ...

  3. (原)使用android studio ndk开发流程

    先使用android stuido创建一个app工程,创建工程的时候,.gradle目录结构下为2.8目录.(note:2.10目录为后续更新结果出现.) 依次修改上述红色方框标注部分内容: 1)修改 ...

  4. MySQL查询优化之explain详解

    MySQL explain命令显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: ...

  5. CorelDRAW X7绘制可爱的卡通动漫多啦A梦

    今天小编为大家分享CorelDRAW X7绘制可爱的卡通动漫多啦A梦方法,教程绘制出来的哆啦A梦非常可爱,适合新手来学习,推荐过来,来看看吧! 1.新建文件 新建A4大小横向画布,双击“矩形工具”绘制 ...

  6. shell脚本重启tomcat

    1. 新建shell空脚本文件,如 /home/tr.sh,并设置权限 # chmod 750 /home/tr.sh 2. 设置文件形式: # sed -e 's/\^M//g' /home/tr. ...

  7. asp.net导出EXCEL的好方法!(好用,导出全部数据)

    1.调用方法: ExportExcel("application/ms-excel", "EXCEL名称.xls", GridView1, this.Page) ...

  8. JSTL的if...else项目小试

      最近在项目中有一个小的效果显示为:在前端,根据一个字段来判断是否弹出一个窗口. 具体需求为:单击表格中的课程名称链接,如果此课程已经被排课,那么就弹出排课窗口,如果未排课就弹出提示box. 具体的 ...

  9. 分页功能实现之通过ajax实现表单内容刷新

    拿代码来说话 我们的需求就是点击翻页功能,实现表格内容局部刷新且能够翻到对应的页面上,不明白? 那么就看看下面的图,需要达到的效果如下所示: 现在要实现的功能就是把红线框起来的表单内容 在点击翻页的时 ...

  10. 2015-10-07:几乎100%肯定:百度网盘在夜间的时段是不限速的:早晨7点前很轻松达到3M/S,7点后就降低到1M/S了,白天才400K/S左右

    最近发现(2015-10-07)几乎100%肯定:百度网盘在夜间的时段是不限速的:早晨7点前很轻松达到3M/S,7点后就降低到1M/S了,白天才400K/S左右