- 浏览: 25253 次
- 性别:
- 来自: 长春
最新评论
黑马程序员——TCP协议
- 博客分类:
- 黑马程序员
----------------------------android培训、java培训、期待与您交流!----------------------------
TCP和其他技术
1.TCP的传输。
Socket和ServerSocket,建立客户端和服务器端。建立连接后,通过Socket中的IO流进行数据的传输。关闭Socket。同样,客户端和服务器端是两个独立的应用程序。
/*
演示tcp传输。
1,tcp分客户端和服务端。
2,客户端对应的对象是Socket。
服务端对应的对象是ServerSocket。
*/
/*
客户端,
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
需求:给服务端发送给一个文本数据。
步骤:
1,创建Socket服务。并指定要连接的主机和端口。
*/
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003);
//为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le ".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上。
服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。
4,关闭服务端。(可选)
*/
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。注意在
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端.
}
//ss.close();
}
}
2.TCP客户端和服务端的相互转发。
服务器端:
public class TcpTransServer {
public static void main(String[] args) {
//创建socket服务端。
try {
ServerSocket ss = new ServerSocket(12345);
// 获取socket
Socket s = ss.accept();
// 从s中获取流,读取数据。
BufferedReader br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s
.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
// 打印从客户端读取的数据。
System.out.println("client:" + line);
// 读取客户端数据,并将它转换成大写的。然后再发往客户端。客户端的readLine方法在等待服务器端
// 往socket里面写入数据。
bw.write(line.toUpperCase());
bw.newLine();
bw.flush();
}
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
public static void main(String[] args) {
// 创建客户端socket服务。
Socket s = null;
try {
s = new Socket("localhost", 12345);
// 创建键盘读取流,为了提高效率加入缓冲区。
BufferedReader in = new BufferedReader(new InputStreamReader(
System.in));
// 获取socket的输出流。
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s
.getOutputStream()));
// 获取socket的输入流。
BufferedReader br = new BufferedReader(new InputStreamReader(s
.getInputStream()));
// 读取键盘数据,并把它写入到Socket流中。
String line = null;
while ((line = in.readLine()) != null) {
if (line.equals("886"))
break;
out.write(line);
out.newLine();
out.flush();
// readLine是阻塞式的方法,没数据的时候就等。在等着socket中的数据,只是时间很短暂。
String data = br.readLine();
System.out.println("server:"+data);
}
in.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(s!=null)
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.TCP上传图片
package net;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 1,建立服务端点。 2,从客户端读取图片数据 3,将读取的数据写入到Scoket中 4,关闭资源
*/
public class UploadPic {
public static void main(String[] args) {
try {
// 创建socket服务端
Socket s = new Socket("localhost", 12345);
InputStream in = new FileInputStream("e:\\1.jpg");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 向socket中写入结束标识。
s.shutdownOutput();
// 从服务器端读取反馈来的数据。
InputStream is = s.getInputStream();
int len1 = is.read(buf);
String str = new String(buf, 0,len1);
System.out.println("server:" + str);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 1,建立服务器端,并指定端口。 2,获得客户端发来的socket对象。 3,从socket对象中获取流,并从流中读取数据。 4,向客户端回送数据。
* */
class ServerPic {
public static void main(String[] args) {
try {
// 建立客户端,获取客户端发来的socket,并通过socket获取客户端上传来的数据。
ServerSocket ss = new ServerSocket(12345);
Socket s = ss.accept();
InputStream is = s.getInputStream();
// 从客户端读取数据并写入到服务器端的硬盘上。
OutputStream out = new FileOutputStream("f:\\1.jpg");
byte[] buf = new byte[1024];
int len = 0;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 向客户端回馈数据。
PrintWriter p = new PrintWriter(s.getOutputStream());
p.write("上传成功");
p.flush();
// 关闭资源。
ss.close();
s.close();
out.close();
p.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.TCP并发上传。
package net;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 完成客户端的并发上传。
* 1,首先考虑使用多线程技术。因为完成并发上传的话,服务器端只有在处理完当前请求的情况下,才能接收下一次请求。
* 2,再考虑在客户端使用还是在服务器端使用。每当一个客户端发出一个请求,服务器端就开出一个线程来处理此次请求。
* 应该在服务器端建立这么一个线程类,用来接收客户端发来的socket对象,并完成服务器端的基本操作。
*
* **/
public class ThreadUpload implements Runnable {
private Socket s;
ThreadUpload(Socket s){
this.s = s;
}
@Override
public void run() {
try {
// 建立客户端,获取客户端发来的socket,并通过socket获取客户端上传来的数据。
// ServerSocket ss = new ServerSocket(12345);
// Socket s = ss.accept();
InputStream is = s.getInputStream();
// 从客户端读取数据并写入到服务器端的硬盘上。
OutputStream out = new FileOutputStream("f:\\1.jpg");
byte[] buf = new byte[1024];
int len = 0;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 向客户端回馈数据。
PrintWriter p = new PrintWriter(s.getOutputStream());
p.write("上传成功");
p.flush();
// 关闭资源。
// ss.close();
s.close();
out.close();
p.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class UploadPic2 {
public static void main(String[] args) {
try {
// 创建socket服务端
Socket s = new Socket("localhost", 12345);
InputStream in = new FileInputStream("e:\\1.jpg");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 向socket中写入结束标识。
s.shutdownOutput();
// 从服务器端读取反馈来的数据。
InputStream is = s.getInputStream();
int len1 = is.read(buf);
String str = new String(buf, 0, len1);
System.out.println("server:" + str);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 1,建立服务器端,并指定端口。 2,获得客户端发来的socket对象。 3,从socket对象中获取流,并从流中读取数据。 4,向客户端回送数据。
* */
class ServerPic2 {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(12345);
while(true){
Socket s = ss.accept();//只要这句话执行完,其他的客户端请求就可以进来了。
new Thread(new ThreadUpload(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.TCP用户并发登录。
/*用户的模拟并发登陆:
* 1,限制用户的登录次数为3次。如果用户输入超过三次还没有登录成功的话。那么会自动结束登录权限。
* 2,服务器端的验证的登录次数最好也是3次。小于3次:客户端进行第3次登录时候,会再开启一个客户端的线程。
* 大于3次:客户端三次登录没成功结束登录,请求都结束了,所以大于3次都是多余的了。
* 3,在客户端定义一个类,读取键盘录入,并将录入信息发到服务器端。
* 4,在服务器端定义一个线程类,用来接收客户端发来的请求,并处理客户端信息。实现并发。
* */
6.模拟IE访问tomcat服务器。
/*1,如何获取浏览器向服务器发送的请求头。
(1)通过浏览器向指定的主机端口(服务器)发送请求。
(2)自定义服务器端,监听端口。
(3)通过socket的读取流,获取请求信息。
2,自定义浏览器
(1)自定义浏览器客户端向服务器端发送请求。
(2)请求的内容模拟浏览器的发送内容。
(3)tomcat接收请求后,回馈响应信息和资源。
(4)客户端获取信息并读取。
*/
public static void main(String[] args) {
try {
Socket s = new Socket("localhost", 8080);
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
// 模拟浏览器中的请求。
out.println("GET /myweb/demo.html HTTP/1.1");
out.println("Accept:*/*");
out.println("Host: localhost:12345");
out.println("Connection: closed");
// 请求头下面必须要有一个空行。
out.println();
// 获取服务器反馈回来的信息。
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
7.URL-URLConnection
//URL和URLConnection对象可以看作是应用层的连接对象。
public class URL_URLConnection {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/myweb/demo.html");
//底层封装了传输层的Socket,conn可以解析服务器端回馈的响应头。浏览器的工作原理就是这样
//解析http头,获得资源内容。
URLConnection conn =url.openConnection();
//底层获取了socket的读取流
InputStream in = conn.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
8.域名解析
先找本机的hosts文件,再通过dns往外找。
9.小知识点
SocketAddress表示InetAddress和port。
ServerSocket可以指定最大客户请求量。
发表评论
-
黑马程序员——内省
2012-11-23 15:39 551-------------- ... -
黑马程序员——泛型
2012-11-23 09:06 715----------------- android培训、ja ... -
黑马程序员——反射
2012-11-22 16:13 704----------------- android培训、jav ... -
黑马程序员——枚举
2012-11-22 09:54 619----------------- android培训、jav ... -
黑马程序员——银行业务调度系统
2012-11-21 21:31 550----------------- an ... -
黑马程序员——交通灯管理系统
2012-11-20 10:28 758----------------- android培训、ja ... -
黑马程序员——网络编程概述和UDP
2012-11-17 09:07 706----------------- android培训,jav ... -
黑马程序员——File和特殊流对象
2012-11-03 14:38 811-------------------------- an ... -
黑马程序员——Java_IO操作
2012-10-31 20:48 991--------------------------- ...
相关推荐
~$20-实验三:Ethereal Lab —— TCP协议.doc
微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长...
徐州工程学院计算机网络实验报告——TCP 协议 TCP 协议是计算机网络中一种面向连接的传输层协议,它提供了可靠的数据传输服务。TCP 协议的报文格式、连接建立和释放、数据传输、重传机制等都是计算机网络实验报告的...
实验报告标题:TCP协议分析 在本次实验中,主要探讨了TCP协议的关键特性,包括TCP报文段结构、TCP三次握手、TCP连接终止以及TCP连接的重置过程。以下是详细的实验解析: 一、TCP报文段结构 TCP报文段由首部和数据...
Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接)
【TCP作业抓包——TCP、HTTP协议】 TCP和HTTP协议在网络通信中扮演着至关重要的角色。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而HTTP(Hypertext Transfer ...
Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...
4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...
基于构件的嵌入式操作系统开发平台——TCP 2fIP协议栈的研析
高等院校图书馆计算机网络安全与防范——TCP_IP网络协议漏洞分析及解决途径.pdf
《高级网络操作系统及其应用——TCP/IP协议与分组无线网》是针对网络专业人士的重要学习资料,特别是对于深入理解网络操作系统的复杂性和TCP/IP协议在分组无线网络中的应用有着极其关键的价值。本部分将深入探讨这些...
(图片说明:TCP是以太网协议和IP协议的上层协议,也是应用层协议的下层协议。) 最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。(图片说明:以太网协议解决...
7. **网络基础**:HTTP协议、TCP/IP基础知识,以及客户端-服务器交互的原理,可能涉及到Socket编程。 8. **数据库基础**:SQL语言的基本操作,如CRUD(创建、读取、更新、删除)和简单的查询语句。 9. **Android...
计算机网络基础知识(TCP/IP协议栈、网络安全等)。 ### 学习建议 为了最大化利用这类教学资源的价值,建议学习者采取以下策略: - 在观看视频之前,先预习相关的基础知识,以便更好地理解和吸收新内容。 - 观看时...
首先,了解Modbus TCP:Modbus是基于ASCII或RTU(远程终端单元)的串行通信协议,而Modbus TCP是其在网络层的扩展,将Modbus协议应用于TCP/IP协议栈上,使得设备可以通过以太网进行通信。这大大提高了数据传输的效率...
详见:https://blog.csdn.net/weixin_38566632/article/details/124289573 Qt网络编程——TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件
"TCP作业抓包——ARP协议" TCP/IP 原理与应用作业二——利用 WireShark 分析 ARP 协议 一、实验目的 学习使用网络抓包软件 WireShark,掌握 ARP 协议。 二、实验内容分析 ARP 协议请求及响应过程。 三、实验工具...
【TCP/IP协议详解】 TCP/IP协议是计算机网络通信的基础,它是Internet的核心协议,负责不同设备间的通信。TCP/IP协议族由四层组成:应用层、传输层、互联网层和网络接口层。 1. **网络协议的基本概念** - **网络...