`
把阳光剪成雨Java
  • 浏览: 25386 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

黑马程序员——TCP协议

 
阅读更多

 ----------------------------android培训java培训、期待与您交流!----------------------------

TCP和其他技术

1.TCP的传输。

      SocketServerSocket,建立客户端和服务器端。建立连接后,通过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();

              }

       }

    }

3TCP上传图片

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

//URLURLConnection对象可以看作是应用层的连接对象。

public class URL_URLConnection {

    public static void main(String[] args) {

       try {

       URL url = new URL("http://localhost:8080/myweb/demo.html");

//底层封装了传输层的Socketconn可以解析服务器端回馈的响应头。浏览器的工作原理就是这样

//解析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表示InetAddressport

ServerSocket可以指定最大客户请求量。

 

分享到:
评论

相关推荐

    ~$20-实验三:Ethereal Lab —— TCP协议.doc

    ~$20-实验三:Ethereal Lab —— TCP协议.doc

    微信小程序——TCP,IP长连接(截图+源码).zip

    微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长连接(截图+源码).zip 微信小程序——TCP,IP长...

    徐州工程学院计算机网络实验报告——TCP协议.doc

    徐州工程学院计算机网络实验报告——TCP 协议 TCP 协议是计算机网络中一种面向连接的传输层协议,它提供了可靠的数据传输服务。TCP 协议的报文格式、连接建立和释放、数据传输、重传机制等都是计算机网络实验报告的...

    周五计网个人实验4+张楷+19035331——TCP协议分析1

    实验报告标题:TCP协议分析 在本次实验中,主要探讨了TCP协议的关键特性,包括TCP报文段结构、TCP三次握手、TCP连接终止以及TCP连接的重置过程。以下是详细的实验解析: 一、TCP报文段结构 TCP报文段由首部和数据...

    Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接)

    Qt入门(七)——TCP传输协议(利用多线程实现多个客户机与服务器连接)

    TCP作业抓包——TCP、HTTP协议

    【TCP作业抓包——TCP、HTTP协议】 TCP和HTTP协议在网络通信中扮演着至关重要的角色。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而HTTP(Hypertext Transfer ...

    黑马程序员-Qt讲义.pdf

    Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...

    黑马程序员基础测试题答案

    4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...

    基于构件的嵌入式操作系统开发平台——TCP 2fIP协议栈的研析.pdf

    基于构件的嵌入式操作系统开发平台——TCP 2fIP协议栈的研析

    高等院校图书馆计算机网络安全与防范——TCP_IP网络协议漏洞分析及解决途径.pdf

    高等院校图书馆计算机网络安全与防范——TCP_IP网络协议漏洞分析及解决途径.pdf

    高级网络操作系统及其应用——TCP~IP协议与分组无线网

    《高级网络操作系统及其应用——TCP/IP协议与分组无线网》是针对网络专业人士的重要学习资料,特别是对于深入理解网络操作系统的复杂性和TCP/IP协议在分组无线网络中的应用有着极其关键的价值。本部分将深入探讨这些...

    五分钟读懂TCP协议——TCP协议简介

    (图片说明:TCP是以太网协议和IP协议的上层协议,也是应用层协议的下层协议。) 最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。(图片说明:以太网协议解决...

    黑马程序员入学测试题

    7. **网络基础**:HTTP协议、TCP/IP基础知识,以及客户端-服务器交互的原理,可能涉及到Socket编程。 8. **数据库基础**:SQL语言的基本操作,如CRUD(创建、读取、更新、删除)和简单的查询语句。 9. **Android...

    黑马程序员最新一期高清教学视频

    计算机网络基础知识(TCP/IP协议栈、网络安全等)。 ### 学习建议 为了最大化利用这类教学资源的价值,建议学习者采取以下策略: - 在观看视频之前,先预习相关的基础知识,以便更好地理解和吸收新内容。 - 观看时...

    vb.net&C#和PLC通过Modbus——TCP通讯代码

    首先,了解Modbus TCP:Modbus是基于ASCII或RTU(远程终端单元)的串行通信协议,而Modbus TCP是其在网络层的扩展,将Modbus协议应用于TCP/IP协议栈上,使得设备可以通过以太网进行通信。这大大提高了数据传输的效率...

    Qt网络编程——TCP 服务器 客户端 代码

    详见:https://blog.csdn.net/weixin_38566632/article/details/124289573 Qt网络编程——TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件

    TCP作业抓包——ARP协议

    "TCP作业抓包——ARP协议" TCP/IP 原理与应用作业二——利用 WireShark 分析 ARP 协议 一、实验目的 学习使用网络抓包软件 WireShark,掌握 ARP 协议。 二、实验内容分析 ARP 协议请求及响应过程。 三、实验工具...

    3-TCP——IP协议 计算机专业

    【TCP/IP协议详解】 TCP/IP协议是计算机网络通信的基础,它是Internet的核心协议,负责不同设备间的通信。TCP/IP协议族由四层组成:应用层、传输层、互联网层和网络接口层。 1. **网络协议的基本概念** - **网络...

Global site tag (gtag.js) - Google Analytics