java网络编程之TCP通讯
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通讯的更多相关文章
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- java网络编程之UDP通讯
详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...
- Java网络编程之TCP通信
一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 4.Java网络编程之TCP/UDP
常见传输协议: UDP , TCP UDP协议: 特点: 1.将数据及源和目的封装成数据包中,不需要建立连接 2.每个数据包的大小限制在64K内 ...
- java网络编程之TCP实例
Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
- Java网络编程之InetAddress浅析
Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...
随机推荐
- iOS小技巧
键盘透明: textField.keyboardAppearance = UIKeyboardAppearanceAlert; 状态栏的网络活动风火轮是否旋转: [UIApplication shar ...
- 第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- 轻量级的jquery
话不多说,直接上源代码 一.tool.js 封装一些共用方法,以及相关的浏览器兼容细节,供Base.js调用 //浏览器检测,一旦加载即执行 (function() { window.sys = {} ...
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- ECharts 在同一个页面添加多个图表 并 给图表绑定事件
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>ECharts< ...
- linux:习惯
1>.系统里面必须最少有两个账号,一个root,一个普通账户; 2>.平时登录系统均使用普通账户登录,除非需要配置或者执行特殊命令才切换至root; 3>.linux系统下严格区分大 ...
- 《30天自制操作系统》06_day_学习笔记
harib03a: 内容没有变化 :P109 从这里开始,代码开始工程化了. 将原本300多行的bootpack.c分割成了三部分: graphic.c : 用来处理界面图像 dsctbl. ...
- PostgreSQL Replication之第十二章 与Postgres-XC一起工作(6)
12.6 添加节点 Postgres-XC允许您在那个过程中的任何一个时间点添加新的服务器到计划中.所有您需要做的是按照我们之前演示的设置一个节点,并在 控制器上调用CREATE NODE.然后,该系 ...
- [原创]java WEB学习笔记76:Hibernate学习之路---Hibernate介绍,hibernate 环境的搭建
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 用C语言操纵Mysql
以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接. typedef struct st_mysql { NET net; ...