基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~

今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西。

1、首先先来看下基于TCP协议Socket服务端和客户端的通信模型:

Socket通信步骤:(简单分为4步)

1.建立服务端ServerSocket和客户端Socket

2.打开连接到Socket的输出输入流

3.按照协议进行读写操作

4.关闭相对应的资源

2、相关联的API:

1.首先先来看下ServerSocket

类 ServerSocket

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

一些重要的方法:(具体大家查看官方api吧)

ServerSocket(int port, int backlog)
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

bind(SocketAddress endpoint, int backlog)
ServerSocket 绑定到特定地址(IP
地址和端口号)。

accept()
侦听并接受到此套接字的连接

getInetAddress()
返回此服务器套接字的本地地址。

close()
关闭此套接字。

2.再来看下Socket

类 Socket  

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

一些重要的方法:(具体大家查看官方api吧)

Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

getInetAddress()
返回套接字连接的地址。

shutdownInput()
此套接字的输入流置于“流的末尾”。

shutdownOutput()
禁用此套接字的输出流。

close()
关闭此套接字。

3、代码实现:(注释很全,这里就不详细多说了)

服务端Server.java

1.创建ServerSocket对象,绑定并监听端口

2.通过accept监听客户端的请求

3.建立连接后,通过输出输入流进行读写操作

4.关闭相关资源

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9
10
11 public class Server {
12
13     /**
14      * Socket服务端
15      */
16     public static void main(String[] args) {
17         try {
18             ServerSocket serverSocket=new ServerSocket(8888);
19             System.out.println("服务端已启动,等待客户端连接..");
20             Socket socket=serverSocket.accept();//侦听并接受到此套接字的连接,返回一个Socket对象
21
22
23             //根据输入输出流和客户端连接
24             InputStream inputStream=socket.getInputStream();//得到一个输入流,接收客户端传递的信息
25             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//提高效率,将自己字节流转为字符流
26             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//加入缓冲区
27             String temp=null;
28             String info="";
29             while((temp=bufferedReader.readLine())!=null){
30                 info+=temp;
31                 System.out.println("已接收到客户端连接");
32                 System.out.println("服务端接收到客户端信息:"+info+",当前客户端ip为:"+socket.getInetAddress().getHostAddress());
33             }
34
35             OutputStream outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息
36             PrintWriter printWriter=new PrintWriter(outputStream);//将输出流包装成打印流
37             printWriter.print("你好,服务端已接收到您的信息");
38             printWriter.flush();
39             socket.shutdownOutput();//关闭输出流
40
41
42
43             //关闭相对应的资源
44             printWriter.close();
45             outputStream.close();
46             bufferedReader.close();
47             inputStream.close();
48             socket.close();
49
50         } catch (IOException e) {
51             e.printStackTrace();
52         }
53     }
54
55 }

客户端Client.java

1.创建Socket对象,指定服务端的地址和端口号

2.建立连接后,通过输出输入流进行读写操作

3.通过输出输入流获取服务器返回信息

4.关闭相关资源

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9
10
11 public class Client {
12
13     /**
14      * Socket客户端
15      */
16     public static void main(String[] args) {
17         try {
18             //创建Socket对象
19             Socket socket=new Socket("localhost",8888);
20
21             //根据输入输出流和服务端连接
22             OutputStream outputStream=socket.getOutputStream();//获取一个输出流,向服务端发送信息
23             PrintWriter printWriter=new PrintWriter(outputStream);//将输出流包装成打印流
24             printWriter.print("服务端你好,我是Balla_兔子");
25             printWriter.flush();
26             socket.shutdownOutput();//关闭输出流
27
28             InputStream inputStream=socket.getInputStream();//获取一个输入流,接收服务端的信息
29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包装成字符流,提高效率
30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//缓冲区
31             String info="";
32             String temp=null;//临时变量
33             while((temp=bufferedReader.readLine())!=null){
34                 info+=temp;
35                 System.out.println("客户端接收服务端发送信息:"+info);
36             }
37
38             //关闭相对应的资源
39             bufferedReader.close();
40             inputStream.close();
41             printWriter.close();
42             outputStream.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49
50     }
51
52 }

4、效果截图:

服务端:

客户端:

以上代码实现了,但客户端和服务端的连接,若要实现多客户端操作,需要涉及到多线程,每个接收到的Socket对象单独开一条线程操作,然后用一个死循环while(true)去监听端口就行,继续代码下篇文章写。

时间: 2024-10-13 23:14:12

基于TCP协议的简单Socket通信笔记(JAVA)的相关文章

基于TCP协议下的socket编程

socket: TCP/IP协议中一个端口号和一个IP地址绑定在一起就生成一个socket就表示了网络中唯一的一个进程,它是全双工的工作方式. 基于TCP的socket编程 函数的使用: 1.socket()         #include <sys/types.h>          /* See NOTES */        #include <sys/socket.h>        int socket(int domain, int type, int protoco

C++基于TCP和UDP的socket通信

以下是关于socket编程的一个非常经典的例子: 服务端: #include <stdio.h> #include <Winsock2.h> //windows socket的头文件 #pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件 void main() { //初始化winsocket WORD wVersionRequested; WSADATA wsaData; int err; wVer

【tcp-ip学习总结】使用tcp协议实现简单的通信小程序

环境:vs2013 server.c #include<Winsock2.h> #include<stdio.h> #pragma comment(lib,"Ws2_32.lib") #include<stdlib.h> void main() { WSADATA wsaData;//协议栈 struct sockaddr_in server, client;//服务端和客户端的地址 int iLen; char recMessage[1024];

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)

Android基础入门教程--7.6.3 基于TCP协议的Socket通信(2) 标签(空格分隔): Android基础入门教程 本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务

什么是 socket?简述基于 tcp 协议的套接字通信流程?

Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计算机之间的通信. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 基于tcp 协议的套接字通信流程: 1). 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听. 2). 用 bind

Learning-Python【28】:基于TCP协议通信的套接字

什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议. 所以,我们无需深入理解 TCP/UDP 协议,socket 已经为我们封装好了,我们只需要遵循 socket 的规定去编程,写出的程序自然就是遵循 TCP/UDP 标准的. 套接字的分类: 基于文件

python中基于tcp协议的通信(数据传输)

tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务端: fr