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. Android适配(屏幕适配、国际化适配)-转

    首先来说一下Android的屏幕适配: 关于Android屏幕的一些基本概念知识,自行充电..在此只介绍实际开发过程中的使用 1.说到Android的屏幕适配,首当其冲的就是图片的适配 图片适配遵循两 ...

  2. Android --Search界面样式

    Lay_Weight 权重属性的使用 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  3. 面向对象编程(八)——this关键字

    很多人一提起它,就说“当前对象”,可到底什么是当前对象,是什么当前对象,他自己也不清楚. this(隐式参数) 普通方法中,this总是指向当前调用该方法的对象. 构造方法中,this总是指向正要初始 ...

  4. js DOM 元素ID就是全局变量

    有人在twitter上提到了:在Chrome的JavaScript终端中,你只需要输入一个元素的ID,就可以访问到这个元素.@johnjbarton给了解释,这是因为所有的元素ID都是全局变量.本文再 ...

  5. Java基础之读文件——使用通道随机读写文件(RandomReadWrite)

    控制台程序,使用通道随机读写primes_backup.bin文件. import static java.nio.file.StandardOpenOption.*; import java.nio ...

  6. linux:ACL权限

    ACL权限是为了防止权限不够用的情况,一般的权限有所有者.所属组.其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限: 比如:一个网络老师,给一个班的学员上课,他在linux的根目录下 ...

  7. CommonJS规范

    CommonJS是一种规范,NodeJS是这种规范的实现.CommonJS是一 个不断发展的规范,计划将要包括如下部分: Modules Binary strings and buffers Char ...

  8. iptables使用

    iptables规则的查看.添加.删除和修改 1.查看 iptables -nvL --line-number (这个命令跟/etc/init.d/iptables status 输出差不多) -L ...

  9. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法

    在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...

  10. Lintcode: Median

    Given a unsorted array with integers, find the median of it. A median is the middle number of the ar ...