TCP 通信的客户端;向服务器发送连接请求,给服务器发送数据,读取服务器会写的数据

表示客户端的类:

java.net.Socket;此类实现客户端套接字。套接字是两台机器间通信的端点

套接字:包含了IP地址和端口号的网络单位。

构造方法:

Socket(string host,int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。

参数:

string host:服务器主机的名称/服务器的IP地址。

int port: 服务器的端口号

成员方法:

OutputStream getOutputstream()  返回此套接字的输出流

InputStream getInputStream() 返回此套接字的输入流

void close() 关流

实现步骤:

1. 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号。

2. 使用Socket对象中的方法getOutputStream()获取网络输出流OutputStream对象

3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据。

4.使用Socket对象中的方法getInputStream()获取网络输入流InputStream对象

5.使用网络字节输入流InputStream对象中的read方法,读取服务器回写的数据

6.释放资源(Socket.close)

注意:

1.客户端和服务器进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象

2.当我们创建客户端对象Socket的时候,就会去请求服务器和服务器进行连接

经过三次握手建立连接通路,如果服务器没有启动,那么就会抛出异常.

如果服务器已经启动,那么就可以进行正常交互。

代码如下

public class TCPCllent {

public static void main(String[] args){

// 1. 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号。

Socket soc=new Socket("192.168.1.107",8888);

// 2. 使用Socket对象中的方法getOutputStream()获取网络输出流OutputStream对象

OutputStream os=soc.getOutputStream();

// 3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据。

os.write("你好服务器".getBates());

// 4.使用Socket对象中的方法getInputStream()获取网络输入流InputStream对象

InputStream in= soc.getInputStream();

// 5.使用网络字节输入流InputStream对象中的read方法,读取服务器回写的数据

byte[]by=new byte[1024];

int len= in.read(by)

System.out.println(new String(b,0,len));

}

}

TCP通信的服务器端:

表示服务器的类:

java.net.ServerSocket:此类实现服务器套接字

构造方法:

ServerSocket(int port) 创建绑定到特定端口的服务器套接字。

服务器必须明确一件事,必须的知道是哪个客户端请求的服务器

所以可以使用accept()方法获取到请求的客户端对象Socket

成员方法:

Socket accept() 侦听并接收到此套接字的连接。

实现步骤:

1.创建服务器ServerSocket对象和系统要指定的端口号。

2.使用ServerSocket对象中的方法accept(),获取到请求的客户端对象。

3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象

4.使用网络字节输入流InputStream对象中的方法read()读取客户端发送的数据。

5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象

6.使用网络字节输出流对象OutputStream中的write()方法给客户端回写数据

7.释放资源(ServerSocket)

代码如下:

public class TCPServerSocket{

public static void main(String[] args){

//1.创建服务器ServerSocket对象和系统要指定的端口号。

ServerSocket ser=new ServerSocket(8888);

//2.使用ServerSocket对象中的方法accept(),获取到请求的客户端对象Socket。

Socket ke= ser.accept();

// 3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象

InputStream pu= ke.getInputStream();

//4.使用网络字节输入流InputStream对象中的方法read()读取客户端发送的数据。

byte[] by=new byte[1024];

int ten=pu.read(by);

System.out.println(new String(by,0,ten));

//5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象

OutputStream out= ke.getOutputStream();

//6.使用网络字节输出流对象OutputStream中的write()方法给客户端回写数据

out.write("收到谢谢".getBytes());

//7.释放资源(ServerSocket)

ser.close();

ke.close();

}

}

客户端(发送数据和接收服务端的数据):必须先启动服务器

package Socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

public class ClientDemo {

public ClientDemo() {

}

public static void main(String[] args) {

try {

Socket socket = new Socket("127.0.0.1", 8888); // 指定要访问的ip和端口号

// 通过reader来读取数据

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 通过writer来向服务端发送数据

PrintStream writer = new PrintStream(socket.getOutputStream());

System.out.println(reader.readLine()); // 读取服务数据

writer.println("我想咨询一下"); // 向服务写入数据

socket.close(); // 关闭socket,最好在finally中关闭

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

服务器端(发送数据和接收服务端的数据):

package Socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class ServiceDemo {

public ServiceDemo() {

}

public static void main(String[] args) {

new Thread() {

public void run() {

try {

final ServerSocket socket = new ServerSocket(8888);// 指定端口号

while (true) { // 不断接受客户端请求 因为有多个客户端 ,需要请求 只有一个服务器端

Socket accept = socket.accept(); // 接受客户端的请求

BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream())); // 获取客户端输入流

PrintStream ps = new PrintStream(accept.getOutputStream());// 获取客户端输出流

ps.println("可以啊");

System.out.println(br.readLine());

// socket.close();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

};

}start();

}

}

控制台:

例子二:向服务端传文件:

服务端:

package Socket;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class FileServer {

public static void main(String[] args) {

/**

* 先从客户端发文件名到服务端,服务端判断外汇返佣是否有该文件 没有的话服务端通知客户端,可以上传文件了,客户端上传文件,服务端接收文件。

*/

new Thread() {

public void run() {

try {

ServerSocket sockets = new ServerSocket(12345);

Socket socket = sockets.accept();

InputStream is = socket.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is));

PrintStream ps = new PrintStream(socket.getOutputStream());

String name = bf.readLine();

// 创建文件夹 封装成file对象,判断存在

// 判断文件是否存在,存在就退出

File f = new File("update");

f.mkdir();

File file = new File(f, name);

if (file.exists()) {

ps.println("存在");

socket.close();

return;

} else {

ps.print("不存在");

}

// 从网络读取数据 存储到本地

FileOutputStream fis = new FileOutputStream(file);

int len = 0;

byte[] b = new byte[1024];

while ((len = is.read(b)) != 1) {

fis.write(b, 0, len);

}

fis.close();

socket.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

};

}.start();

}

}

客户端:

package Socket;

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

public class FileClient {

public static void main(String[] args) {

// 获取文件的路径 验证是否是文件夹 和文件是否存在

File file = getFile();

// 发送文件名到服务器

try {

Socket socket = new Socket("127.0.0.1", 12345);

BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintStream ps = new PrintStream(socket.getOutputStream());

ps.println(file.getName());

// 接收结果 如果文件存在则 直接退出 否则 发文件到服务器

String result = bf.readLine();

if (result.equals("存在")) {

System.out.println("您上传的文件存在 ,请不要重复上传");

socket.close();

return;

}

//发送文件到服务器

FileInputStream fis = new FileInputStream(file);

byte[] b = new byte[8888];

int len;

while ((len = fis.read(b)) != -1) {

ps.write(b, 0, len);

}

ps.close();

fis.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

private static File getFile() {

Scanner input = new Scanner(System.in);

System.out.println("请输入一个文件路径:");

while (true) {

String str = input.nextLine();

File f = new File(str);

if (!f.exists()) {

System.out.println("您输入的文件路径不存在");

} else if (f.isDirectory()) {

System.out.println("你输入的是文件夹路径");

} else {

return f;

}

}

}

}

使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello,world”,客户端收到数据后打印输出。

代码如下:

package Tcp;

import java.io.InputStream;

import java.net.InetAddress;

import java.net.Socket;

public class client {

public static void main(String[] args) throws Exception {

new TCPClient().connect();

}

}

class TCPClient{

private static final int PORT=8539;

public void connect() throws Exception{

//创建一个Socket并连接到给出地址和端口号的计算机

Socket client = new Socket(InetAddress.getLocalHost(),PORT);

InputStream is= client.getInputStream(); //得到接受数据的流

byte[] bs =new byte[1024]; //定义1024个字节数组的缓冲区

int len=is.read(bs);//将数据读入到缓冲区中

System.out.println(new String(bs,0,len));

client.close();

}

}

服务端的代码如下:

package Tcp;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static void main(String[] args) throws Exception {

new TCPServer().listen();

}

}

//TCP服务端

class TCPServer{

private static final int PORT=8539; //定义一个端口号

public void listen() throws Exception{

ServerSocket serverSocket =new ServerSocket(PORT);

Socket client = serverSocket.accept();

OutputStream os =client.getOutputStream();//获取客户端的输出流

os.write(("Hello world").getBytes());

os.close();

client.close();

}

网络编程之TCP协议怎么使用?的更多相关文章

  1. 网络编程之tcp协议以及粘包问题

    网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...

  2. 网络编程之TCP协议与UDP协议

    了解网络就要了解一些基本的协议今天主要跟大家分享一些关于TCP 协议UDP协议的相关知识 首先介绍一下TCP协议 TCP(Transmission Cintrol Protocol)可靠的.面向连接的 ...

  3. java 26 - 7 网络编程之 TCP协议代码优化

    上次所写的代码中,客户端和服务器端所进行的数据传输所用的是字节流. 优化: A:这次,为了高效,对这个字节流通过转换流来进行包装,包装成高效字符流. B:这次,传输的数据是通过键盘录入的数据. 服务器 ...

  4. java 26 - 6 网络编程之 TCP协议 传输思路 以及 代码

    TCP传输 Socket和ServerSocket 建立客户端和服务器 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器是两个独立的应用程序 TCP协议发送 ...

  5. python六十九课——网络编程之TCP协议

    1.1 概述: TCP协议通过三次握手协议将客户端与服务器端连接,两端使用各自的Socket对象.Socket对象中包含了IO流,供数据传输. 即:TCP协议在客户端与服务器端通过Socket组成了I ...

  6. day28 8_7 网络编程之tcp协议

    一.socket模块 socket模块就是用来网络搭建的模块,socket也叫套接字. 创建网络连接,需要使用两个模块进行模拟,一个作为server服务器端,一个作为client客户端. 在服务器端, ...

  7. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

  8. java 26 - 8 网络编程之 TCP协议的练习

    TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...

  9. java 26 - 8 网络编程之 TCP协议上传图片

    上次的是上传TXT文件,这次上传的是图片.同样,上传成功需要反馈给客户端. 区别: TXT文件用记事本打开,我们可以看得懂,所以用了缓冲字符流,对通道内的字节流进行包装了. 而图片用记事本打开,我们看 ...

随机推荐

  1. static变量与普通变量的异同

    1.static局部变量与普通局部变量的异同 相同点:都是局部变量,在函数内部定义,仅能被该模块内部的语句所访问. 不同点: 1)内存分配与释放: static修饰的局部变量在内存中存放在静态存储区, ...

  2. Dubbox服务的提供方配置

    在src/main/resources下创建applicationContext-service.xml ,内容如下: <?xml version="1.0" encodin ...

  3. Galaxy

    Galaxy 在一维坐标轴上给出n个点,第i个点坐标为\(x_i\),现在你可以任意移动k个点的,最小化它们的方差,\(n\leq 50000\). 解 感觉以前写的太乱了,补一篇可以供快速阅读的题解 ...

  4. mysql中创建函数

    MySql创建函数 一.查看创建函数的功能是否开启: mysql> show variables like '%func%'; +-------------------------------- ...

  5. 【leetcode】957. Prison Cells After N Days

    题目如下: There are 8 prison cells in a row, and each cell is either occupied or vacant. Each day, wheth ...

  6. SQL 删除

    SQL Delete 语句(删除表中的记录) DELETE语句用于删除表中现有记录. SQL DELETE 语句 DELETE 语句用于删除表中的行. SQL DELETE 语法 DELETE FRO ...

  7. session控制登入权限

    <?php session_start(); if(empty($_SESSION["uid"]))//判断SESSION是不是为空 { header("locat ...

  8. 【LeetCode 12】整数转罗马数字

    题目链接 [题解] (涨知识了..原来罗马数字是这么回事.. 把{1,4,5,9,10,40,50,90,100,400,500,900,1000}这些东西的罗马数字放在一个数组里面. 每次从大到小减 ...

  9. Android中的Service的使用详解

    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不 ...

  10. Windows 安装 Anaconda3+PyCharm

    由于本人使用的是windows 10 操作系统,所以介绍在 windows 10 系统中安装 Anaconda3 的过程. 下载 Anaconda 官网下载地址:https://www.anacond ...