javaAPI_网络编程基础_网络编程基础2

网络编程基础2

1.TCP协议

(1).实现步骤
A:创建发送端的Socket对象
这一步如果成功,就说明连接已经建立成功了。
B:获取输出流,写数据
C:释放资源

连接被拒绝。TCP协议一定要先看服务器。
java.net.ConnectException: Connection refused: connect

(2).客户端
public static void main(String[] args) throws IOException {
// 创建发送端的Socket对象
// Socket(InetAddress address, int port)
// Socket(String host, int port)
// Socket s = new Socket(InetAddress.getByName("192.168.12.92"), 8888);
Socket s = new Socket("192.168.12.92", 8888);

// 获取输出流,写数据
// public OutputStream getOutputStream()
OutputStream os = s.getOutputStream();
os.write("hello,tcp,我来了".getBytes());

// 释放资源
s.close();
}

(3).服务器端接收数据步骤
A:创建接收端的Socket对象
B:监听客户端连接。返回一个对应的Socket对象
C:获取输入流,读取数据显示在控制台
D:释放资源

(4).代码实现
public static void main(String[] args) throws IOException {
// 创建接收端的Socket对象
// ServerSocket(int port)
ServerSocket ss = new ServerSocket(8888);

// 监听客户端连接。返回一个对应的Socket对象
// public Socket accept()
Socket s = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。

// 获取输入流,读取数据显示在控制台
InputStream is = s.getInputStream();

byte[] bys = new byte[1024];
int len = is.read(bys); // 阻塞式方法
String str = new String(bys, 0, len);
//获取IP地址
String ip = s.getInetAddress().getHostAddress();

System.out.println(ip + "---" + str);

// 释放资源
s.close();
// ss.close(); //这个不应该关闭
}

(5).TCP协议接收发送数据图解

2.TCP协议常用案例

(1).客户端与服务器通信并且服务器端给客户端反馈

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(9999);

// 监听客户端的连接
Socket s = ss.accept(); // 阻塞

// 获取输入流
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys); // 阻塞
String server = new String(bys, 0, len);
System.out.println("server:" + server);

// 获取输出流
OutputStream os = s.getOutputStream();
os.write("数据已经收到".getBytes());

// 释放资源
s.close();
// ss.close();
}

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 9999);

// 获取输出流
OutputStream os = s.getOutputStream();
os.write("今天天气很好,适合睡觉".getBytes());

// 获取输入流
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);// 阻塞
String client = new String(bys, 0, len);
System.out.println("client:" + client);

// 释放资源
s.close();
}

(2).客户端键盘录入,服务器输出到控制台

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(22222);

// 监听客户端连接
Socket s = ss.accept();

// 包装通道内容的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}

// br.close();
s.close();
// ss.close();
}

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 22222);

// 键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 把通道内的流给包装一下
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) {
// 键盘录入数据要自定义结束标记
if ("886".equals(line)) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}

// 释放资源
// bw.close();
// br.close();
s.close();
}

(3).客户端键盘录入,服务器输出文本文件

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(23456);

// 监听客户端连接
Socket s = ss.accept();

// 封装通道内的数据
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 封装文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

bw.close();
// br.close();
s.close();
// ss.close();
}

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 23456);

// 封装键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 封装通道内的数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}

bw.write(line);
bw.newLine();
bw.flush();
}

// bw.close();
// br.close();
s.close();
}

3.TCP协议常用案例2

(1).TCP协议上传文本文件到服务器端

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 11111);

// 封装文本文件
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 封装通道内流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

// 释放资源
br.close();
s.close();
}

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器端的Socket对象
ServerSocket ss = new ServerSocket(11111);

// 监听客户端连接
Socket s = ss.accept();

// 封装通道内的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 封装文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

bw.close();
s.close();
}

(2).TCP协议上传文件并给反馈

注意问题:
按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?
读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。
所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了。

如何解决呢?
A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。
这样做可以解决问题,但是不好。其实就是加了一个结束标识符
B:Socket对象提供了一种解决方案
public void shutdownOutput()

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 11111);

// 封装文本文件
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 封装通道内流
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 client = brClient.readLine(); // 阻塞
System.out.println(client);

// 释放资源
br.close();
s.close();
}

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器端的Socket对象
ServerSocket ss = new ServerSocket(11111);

// 监听客户端连接
Socket s = ss.accept();// 阻塞

// 封装通道内的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 封装文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

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();
}

(3).上传图片到服务器并给反馈

//服务器端
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(19191);

// 监听客户端连接
Socket s = ss.accept();

// 封装通道内流
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
// 封装图片文件
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("mn.jpg"));

byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush();
}

// 给一个反馈
OutputStream os = s.getOutputStream();
os.write("图片上传成功".getBytes());

bos.close();
s.close();
}

//客户端反馈
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 19191);

// 封装图片文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"林青霞.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();
}

s.shutdownOutput();

// 读取反馈
InputStream is = s.getInputStream();
byte[] bys2 = new byte[1024];
int len2 = is.read(bys2);
String client = new String(bys2, 0, len2);
System.out.println(client);

// 释放资源
bis.close();
s.close();
}

4.TCP协议多客户端上传文件到一个服务器上案例[*****]

//客户端
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.12.92", 11111);

// 封装文本文件
// BufferedReader br = new BufferedReader(new FileReader(
// "InetAddressDemo.java"));
BufferedReader br = new BufferedReader(new FileReader(
"ReceiveDemo.java"));
// 封装通道内流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) { // 阻塞
bw.write(line);
bw.newLine();
bw.flush();
}

// Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
s.shutdownOutput();

// 接收反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String client = brClient.readLine(); // 阻塞
System.out.println(client);

// 释放资源
br.close();
s.close();
}

//服务器端
public class UploadServer {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(11111);

while (true) {
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}

//用户线程端
public class UserThread implements Runnable {
private Socket s;

public UserThread(Socket s) {
this.s = s;
}

@Override
public void run() {
try {
// 封装通道内的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 封装文本文件
// BufferedWriter bw = new BufferedWriter(new
// FileWriter("Copy.java"));

// 为了防止名称冲突
String newName = System.currentTimeMillis() + ".java";
BufferedWriter bw = new BufferedWriter(new FileWriter(newName));

String line = null;
while ((line = br.readLine()) != null) { // 阻塞
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();
} catch (IOException e) {
e.printStackTrace();
}
}
}

原文地址:https://www.cnblogs.com/nwxayyf/p/10294255.html

时间: 2024-10-10 08:07:09

javaAPI_网络编程基础_网络编程基础2的相关文章

javaAPI_网络编程基础_网络编程基础1

网络编程基础 1.网络编程概述 (1).计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件 及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. (2).网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 2.网络模型概述以及图解 (1).计算机网络之间以何种规则进行通信,就是网络模型研究问题. (2).网络模型一般是指 OSI(Open System Interconnection开放系

XXLii_7.21笔记 Linux基础_安装及基础命令

一.Linux安装之虚拟机设置 1.打开虚拟机,在首页点击"创建新的虚拟机". 2.    在新建虚拟机向导里设置,如下图勾选"典型"然后下一步. 注:"典型"表示后续的选择硬件的操作不用自己更改,使用默认. "自定义"表示需要更改虚拟机硬件兼容. 3.这里选择第三项,"稍后安装操作系统". 注: 第一项为物理的光驱网盘安装 4.选择你需要安装的linux发行版本. 5."最大磁盘大小"

Java笔记二十三.网络编程基础与UDP编程

网络编程基础与UDP编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.网络编程基础 1.TCP/IP协议:TCP/IP协议是一个非常实用的网络应用程序通信协议,包括TCP(传输控制协议)和IP地址(计算机唯一标识号). 2.IP地址:IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证),通过这个标识号来指定接收数据的计算机和识别发送数据的计算机,该标识号即为IP地址. (1)Ipv4:指在计算机中IP地址用4个字节(

Android网络编程(一)---Socket基础

Socket通常称为""套接字.Socket字面上的中文意思为"插座".一台服务器可能会提供很多服务,每种服务对应一个Socket,而客户的"插头"也是一个Socket.Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.Socket用于描述IP地址和端口,是一个通信链的句柄.应

Python黑客编程基础3网络数据监听和过滤

Python黑客编程3网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及到的主要python模块:pypcap,dpkt,scapy,scapy-http 涉及到的几个python网络抓包和分析的模块,dpkt和scapy在kali linux 2.0 中默认已经被安装,如果你的系统中没有需要手动安装一下,下面是软件包安装的简单说明. 在kali下

Java基础之网络编程

Java网络编程 课前思考1. 什么是TCP/IP协议?2. TCP/IP有哪两种传输协议,各有什么特点?3. 什么是URL?4. URL和IP地址有什么样的关系?5. 什么叫套接字(Socket)?6. 套接字(Socket)和TCP/IP协议的关系?7. URL和套接字(Socket)的关系?8.1 网络编程基本概念,TCP/IP协议简介 8.1.1 网络基础知识      网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络

Go语言基础之网络编程

现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信.如需了解更详细的网络编程请自行检索和阅读专业资料. 互联网协议介绍 互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网.我们理解了这些协议,就理解

Python基础:网络编程socket基本篇

socket也叫套接字,是对各种协议的封装,实现收发数据. Python里socket工作过程:(图片来自网络) socket在Python中实际上是一个模块,实现发送和接收数据的功能. 因为socket是一个类,所以只导入模块需要使用socket.socket()创建一个socket对象. 创建一个socket格式: socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) 参数名 选项名称 作用 family AF_UNIX

python进阶九_网络编程(一)

Python网络编程一 一.一些基本概念 在Python网络编程这一节中会涉及到很多网络相关的术语,对于一些最基本的概念,如TCP/IP,Socket等等不再赘述,不明白的可以自己去查一查,对于一些常见但是可能不是很熟悉的术语这里做了一个简要的介绍,后续遇到不会因此止步. SNTP:简单网络时间协议(Simple Network Time  Protocol)简单来说就是用来同步因特网中的计算机时钟,需要注意的是这里的SNTP是用户数据报(UDP)协议. MIME:Multipurpose In