java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作,

 /*
*TCP
*建立连接,形成传输数据的通道;
*在连接中进行大数据量传输;
*通过三次握手完成连接,是可靠协议;
*必须建立连接,效率会稍低
*/ /*
* TCP传输
* Socket和ServerSocket建立客户端和服务器端建立连接后,
* 通过Socket中的IO流进行数据的传输关闭socket同样,
* 客户端与服务器端是两个独立的应用程序。
*/ //-------------------------------
//下面的是TCP协议的服务器端代码 import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; /*
* TCP协议接收数据
* 1.创建接收端的socket对象
* 2.监听客户端,返回一个对应的socket对象
* 3.获取输入流,读取数据,显示在控制台
* 4.释放资源
*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建接收端socket对象
ServerSocket ss = new ServerSocket(10086); // 监听客户端,返回一个对应的socket对象
// public Socket accept() 侦听并接受到此套接字的连接。
Socket s = ss.accept(); // 阻塞式方法,直到通道建立 // 获取输入流,读取数据
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys); // 阻塞式方法,直到数据发过来。
String ip = s.getInetAddress().getHostAddress(); String str = new String(bys, 0, len);
System.out.println(str); // 释放资源
s.close();
ss.close(); // 这个不应该关闭
}
} //-------------------------------
//下面是客户端TCP协议的代码
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket; /*
*TCP协议发送数据:
* 1.创建发送端socket对象
* 这一步如果成功,就说明链接已经成功了。
* 2.获取输出流,写数据
* 3.释放资源
*
*TCP一些服务器必须先开启,保证通道简历,否则直接报错。
*java.net.ConnectException: Connection refused: connect
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建发送端socket对象
// Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket socket = new Socket("lpp-PC", 10086);
//“lpp-PC”里面的字符串一般使用服务器端的IP地址代替。 // 获取输出流,写数据
OutputStream os = socket.getOutputStream();
os.write("TCP coming~~~".getBytes()); // 关闭资源
os.close();
}
}
 //==================================
//---------------------------------------------------------------
//下面给出一个案例:客户端从指定文本文件读取数据,发送到服务器端,
//服务器将接收到的数据,再次写入到一个新的文本文件。数据的写/出是字节
//流 //首先给出的是客户端的代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket; /*
* 客户端从文本文件中读取数据,服务器得到数据写入到文本文件,
* 为了在服务器写完数据后,给客户端一个反馈,但是直接在通道内额外的添加数据是不行,会导致双方一直保持等待状态
* 方案
* 1: 在客户端里面额外增加一条语句告诉服务器结束的标志。
* 2: 直接使用JDK给出的方法:shutdownOutput();socket提供了一个中止功能,它会通知服务器别等了,我没有数据过来了。
*/ public class ClientDemo {
public static void main(String[] args) throws IOException {
// 客户端socket对象
Socket s = new Socket("lpp-PC", 12345); // 封装数据源
BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 封装通道内流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream())); // 写入数据
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
} // // 为了告诉服务器写到这里就可以停止了,额外增加一个标记,自定义一个结束标记
// bw.write("over");
// bw.newLine();
// bw.flush(); //socket提供了一个中止功能,它会通知服务器别等了,我没有数据过来了。
s.shutdownOutput(); // 接受服务器的反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String str = brClient.readLine();
System.out.println(str); // 释放资源
br.close();
s.close();
}
} //------------------------------------------
//下面是服务器端的代码 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket; public class ServerDemo {
public static void main(String[] args) throws IOException {
// 服务端socke对象
ServerSocket ss = new ServerSocket(12345); // 监听客户端,获取socke对象
Socket s = ss.accept(); // 封装目标文件
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); // 封装通道中的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream())); // 读取数据,并将数据写入文件
String line = null;
while ((line = br.readLine()) != null) {
// if ("over".equals(line)) {
// break;
// }
bw.write(line);
bw.newLine();
bw.flush();
} // 在文件写出完毕后,给客户端一个反馈,
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
bwServer.write("数据写入完毕");
bwServer.newLine();
bwServer.flush(); // 释放资源
bw.close();
s.close(); }
}

//======================================

//下面的这个例子是客户端读取的是图片文件/视频文件。而服务器会对象通过TCP协议读取到的数据写到对应格式的文中去。

 //先是服务器端的class文件

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class ServerDemo {
public static void main(String[] args) throws IOException {
// 服务端socke对象
ServerSocket ss = new ServerSocket(23456); // 监听客户端,获取socket
Socket s = ss.accept(); // 封装通道内流数据
BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); // 封装图标目的地
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("lpp.jpg")); byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush(); // 尤其是在通道内部使用时,必须使用flush否则丢包
} // 给一个反馈
OutputStream os = s.getOutputStream();
os.write("图片上传成功".getBytes()); // 释放资源
bos.close();
s.close(); }
} //------------------------------------------------
//下面的是客户端的class文件 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; /*
* 客户端读取一个数据,通过TCP协议发送到服务器
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 客户端socke对象
Socket s = new Socket("lll-PC", 23456); // 封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"a.jpg")); // 封装通道数据流
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()); byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush(); //尤其是在通道内部使用时,必须使用flush否则丢包
} // 读取反馈,关闭写入流,并告知服务器端,服务器端的阻塞不再等待向下执行
s.shutdownOutput(); InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len2 = is.read(buf);
String clientStr = new String(buf, 0, len2);
System.out.println(clientStr); // 释放资源
bis.close();
s.close(); }
}

java网络编程之TCP通讯的更多相关文章

  1. Java网络编程之TCP、UDP

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

  2. Java网络编程之TCP

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

  3. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  4. Java网络编程之TCP通信

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

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

    */ .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. 网络编程之TCP编程

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

  9. Java网络编程之InetAddress浅析

    Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...

随机推荐

  1. OProfile 性能分析工具

    OProfile 性能分析工具 官方网站:http://oprofile.sourceforge.net/news/ oprofile.ko模块本文主要介绍Oprofile工具,适用系统的CPU性能分 ...

  2. Kafka使用入门教程 简单介绍

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢?   首先让我们看几个基本的消息系统术语: Kafka将消息以 ...

  3. [BS] 小知识点总结-03

    1.Autolayout中“constrain to margins” Autolayout中的页面边距的问题ios8以后的UIView增加了layoutMargins属性,在Storyboard/I ...

  4. Speed-BI 图表功能:服装订货与销售匹配分析

    在作为一个买手我们根据对市场的预测,订了一批的货回来. 我们总会有一个疑问:我的订货与市场的需求是一致的吗?是否出现了较大偏差.这时我们通过分析两个指标:订货占比与销售占比的差异,进行订货与销售的匹配 ...

  5. 在C#中使用json字符串

    http://jingyan.baidu.com/article/6fb756ecd2b051241858fbef.html

  6. 第二篇 Replication:分发服务器的作用

    本篇文章是SQL Server Replication系列的第二篇,详细内容请参考原文. 分发服务器是SQL Server复制的核心组件.分发服务器控制并执行数据从一个服务器移动到另一个服务器的进程. ...

  7. 运用bat进行数据库备份

    执行Bat脚本 @echo off sqlplus sys/welcome@orcl as sysdba @C:\Users\yangfan\Desktop\login.sql echo 按任意键结束 ...

  8. mysqld_multi部署mysql单机多实例

    1.安装gcc-c++.ncurses依赖包 # yum install gcc-c++ ncurses-devel 2.安装cmake,用来编译mysql # tar -xvf cmake-3.2. ...

  9. Building a RESTful Web Service Using Spring Boot In Eclipse

    一.构建restful web service 创建Maven的java web工程,maven的pom文件加入依赖包 创建包hello Greeting.java package hello; pu ...

  10. Error : L6218E: Undefined symbol downloadAddress (referred from nand.o).

    MKD 报错: linking...LCD.axf: Error: L6218E: Undefined symbol EnZK (referred from ht128x64.o).LCD.axf: ...