TCP通信 -C/S中的Socket与ServerSocket
客户端类:Socket类
TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流
java.lang.Object
继承者 java.net.Socket构造方法:
- Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
参数:
String host:服务器主机名/IP地址
int port:服务器的端口号
- Socket(String host, int port)
成员方法:
- OutputStream getOutputStream()
返回此套接字的输出流。 - InputStream getInputStream()
返回此套接字的输入流。 - void close()
关闭套接字
- OutputStream getOutputStream()
注意:
- 客户端和服务器端交互时,必须使用Socket中提供得网络流,不能使用自己创建的流对象
- 当我们创建客户端Socket对象时,就会使用TCP协议与服务器建立连接通路,若服务器没有启动,就会抛出异常。
服务器类:ServerSocket类
TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据,两次IO流,一直处于等待状态
java.lang.Object
继承者 java.net.ServerSocket构造方法:
- ServerSocket(int port)
创建绑定到特定端口的服务器套接字,不设置操作系统随机分配,无法通信。
- ServerSocket(int port)
成员方法
- Socket accept()
侦听并接受到此套接字的连接。
- Socket accept()
注意: 服务器端必须明确一件事,必须知道是哪个客户端请求的服务器,所以可以使用accept()方法获取到请求的客户端对象Socket
package cn.learn.web;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class client {
public static void main(String[] args) throws IOException {
//1.创建客户端对象Socket,构造方法绑定服务器IP地址和端口号
Socket socket = new Socket("127.0.0.1",8020);
//2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream outputStream = socket.getOutputStream();
//3.使用流中的write方法给服务器发送数据,需要转换成字节数组
outputStream.write("服务器你好".getBytes());
//4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
InputStream clientIn = socket.getInputStream();
//5.使用InputStream对象中的read()方法,读取服务器回写的数据
byte[] bytes = new byte[1024];
int len =clientIn.read(bytes);
//打印看看
System.out.println(new String(bytes,0,len));
//6.释放资源,只关闭Socket的IO流就行
socket.close();
}
}
package cn.learn.web;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//1.设置通信端口号,不然系统随机分配
ServerSocket server = new ServerSocket(8020);
//2.使用serverSocket对象中的方法accept,获取到请求的客户端对象Socket(含地址和端口号)
Socket socket1 = server.accept();
//3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
InputStream serveIn = socket1.getInputStream();
//4.使用serveIn的方法read,读取客户端发送的数据
byte[] bytes = new byte[1024];
//获取读取的数据有效长度
int len = serveIn.read(bytes);
//打印看看
System.out.println(new String(bytes,0,len));
//5.使用Socket对象中的方法getOutputStream()获取网络字节输入流OutputStream对象
OutputStream serverOut = socket1.getOutputStream();
//6.使用serverOut中的write方法回写给客户端
serverOut.write("我收到了".getBytes());
//7.释放socket1与server的流
server.close();
socket1.close();
}
}
TCP通信 -C/S中的Socket与ServerSocket的更多相关文章
- tcp通信:多进程共享listen socket方式
原文链接:http://blog.csdn.net/largetalk/article/details/7939080 看tornado源码多进程(process.py)那段,发现他的多进程模型和一般 ...
- 34、Android中基于Socket的网络通信(一)
Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服 ...
- 手动搭建I/O网络通信框架2:Socket和ServerSocket入门实战,实现单聊
第一章:手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 在第一章中运用Socket和ServerSocket简单的实现了网络通信.这一章,利用BIO编程模型进行 ...
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...
- TCP/IP网络编程中socket的行为
一. read/write的语义:为什么会阻塞? 先从write说起: #include <unistd.h>ssize_t write(int fd, const void *buf, ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
- TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示
今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...
- C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信
首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...
- socket实现udp与tcp通信-java
1.简单介绍Socket Socket套接字 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信. 数 ...
随机推荐
- 使用 Docker Compose 快速构建 TiDB 集群
本文档介绍如何在单机上通过 Docker Compose 快速一键部署一套 TiDB 测试集群.Docker Compose 可以通过一个 YAML 文件定义多个容器的应用服务,然后一键启动或停止. ...
- Redis学习总结(二)--Redis数据结构
Redis支持六种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 结构类型 存储的值 string 可以是字符串.浮 ...
- FFmpeg命令行map参数选择音视频流
FFmpeg命令行map参数选择音视频流 介绍 -map参数告诉ffmpeg要从输入源中选择/拷贝哪个stream流到输出,可以从输入源中选择多个音视频流作为输出. 不加-map参数,ffmpeg默认 ...
- python控制窗口移动(画圆)
import win32con import win32gui import time import math notepad = win32gui.FindWindow("Notepad& ...
- POJ-1847 Tram( 最短路 )
题目链接:http://poj.org/problem?id=1847 Description Tram network in Zagreb consists of a number of inter ...
- lightoj 1125 - Divisible Group Sums (dp)
Given a list of N numbers you will be allowed to choose any M of them. So you can choose in NCM ways ...
- 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维
助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...
- Spring 两大核心 IOC 和 AOP
如果你的简历上写着Spring (请详述一下spring的两大核心)这个问题一定会被问到. 一.什么叫IOC 1. IOC 全称(Inversion of Control)-- 控制反转. IOC 只 ...
- Python---列表的学习(二)
列表的第二部分 (1)列表的排序 1)使用方法sort()可对列表进行永久性排序 food = ['apple','orange','pear','grape'] food.sort() print( ...
- 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)
作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点.这是因为控制器有很多,具体实现大相径庭:且控制器的实现用到了一些较 ...