网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket
Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;socket用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
1、客户端Socket类
此类实现客户端套接字
构造方法
| 构造方法 | 作用 |
|---|---|
| Socket(String host, int port) | 创建一个套接字,并将其连接到指定的主机的指定端口上 |
参数
String host:服务器主机的名称、服务器的IP地址
int port:服务器的端口号
成员方法
| 成员方法 | 作用 |
|---|---|
| OutputStream getOutputStream() | 返回此套接字的字节输出流 |
| InputStream getInputStream() | 返回此套接字的字节输入流 |
| void close() | 关闭此套接字 |
实现步骤
- 创建一个客户端对象Socket,构造方法中绑定服务器的IP地址,端口号
- 使用Socket对象中的方法getOutputStream获取网络字节输出流OutputStream对象
- 使用网络字节输出流OutputStream对象的方法write,给服务器发送信息
- 使用Socket对象的方法getInputStream获取网络字节输入流InputStream对象
- 使用网络字节输入流InputStream的方法read读取服务器返回的信息
- 调用close方法关闭套接字,释放资源
注意:
- 当客户端与服务器交互时,必须使用Socket中提供的网络流,不能使用自己创建的流对象
- 当创建客户端Socket对象时,就会去请求服务器,和服务器进行三次握手建立TCP连接。如果此时服务器没有启动,就会抛出异常,否则就可以进行交互了。
TCP的客户端代码:
package cn.zhuobo.day15.aboutSocket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientSocket {
public static void main(String[] args) throws IOException {
Socket so = new Socket("127.0.0.1", 8868);
OutputStream outputStream = so.getOutputStream();
outputStream.write("你是他妈的服务器吗".getBytes());
InputStream inputStream = so.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
so.close();
}
}
2、服务器套接字ServerSocket
此类实现服务端套接字
构造方法:
| 构造方法 | 作用 |
|---|---|
| ServerSocket(int port) | 创建一个服务器套接字,并绑定到特定的端口号上 |
成员方法:
| 成员方法 | 作用 |
|---|---|
| Socket accept() | 监听并接收此套接字的连接,用这个方法获取请求连接的客户端Socket对象 |
| void close() | 关闭此套接字 |
服务器ServerSocket的实现过程
- 创建服务器ServerSocket对象,并指定需要的端口号
- 使用ServerSocket对象的accept方法获取请求的客户端Socket对象
- 使用获取到的Socket对象的getInputStream方法,获取网络字节输入流InputStream对象
- 使用网络字节输入流InputStream对象的read方法,读取客户端发送的数据
- 使用获取到的Socket对象的getOutputStream方法,获取网络字节输出流OutputStream对象
- 使用网络字节输出流OutputStream队形的write方法,给客户端写回数据
- 释放资源,Socket对象和ServerSocket对象依次调用close方法
服务器ServerSocket代码:
package cn.zhuobo.day15.aboutSocket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServerSocket {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8868);
Socket so = server.accept();
InputStream inputStream = so.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
OutputStream outputStream = so.getOutputStream();
outputStream.write("我是他么的服务器,你是他么的客户端吗".getBytes());
so.close();
server.close();
}
}
这样就客户端和服务器就实现了通信
3、文件上传案例
文件的上传其实就是本地硬盘的文件复制到服务器的硬盘
注意
客户端、服务器和本地进行文件读写,使用的是自己创建道德字节流对象(本地流)
客户端和服务器之间的文件读写,使用的是Socket提供的字节流对象(网络流)
Client代码
package cn.zhuobo.day15.fileUploadPractise;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("/home/zhuobo/Desktop/dir/1.png");
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
while((len = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
}
fis.close();
socket.close();
}
}
Server代码
package cn.zhuobo.day15.fileUploadPractise;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while(true) {
Socket socket = server.accept();
new Thread(new Runnable() {// 每次侦听到有客户端程序要上传文件,也就是accept方法后就开启一个新的线程,提高效率
@Override
public void run() {
try {// 因为run方法没有声明抛出异常,因此只能使用try catch处理异常
InputStream inputStream = socket.getInputStream();
// 如果不存在这个目录就创建
File file = new File("/home/zhuobo/Desktop/uploads");
if(!(file.exists())) {
file.mkdirs();
}
// 文件命名的规则
String filename = "/" + System.currentTimeMillis() + (new Random().nextInt(99999)) + ".png";
FileOutputStream fos = new FileOutputStream(file + filename);
byte[] bytes = new byte[1024];
int len = 0;
while((len = inputStream.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
socket.getOutputStream().write("文件上传成功!".getBytes());
fos.close();
socket.close();
}catch (IOException e) {
System.out.println(e);
}
}
}).start();
}
//server.close();
}
}
网络编程之Socket & ServerSocket的更多相关文章
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- 网络编程之Socket代码实例
网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- java网络编程之Socket编程
概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...
- Java 网络编程之 Socket
========================UDP============================= UDP---用户数据报协议,是一个简单的面向数据报的运输层协议. UDP不提供可靠性, ...
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- Python网络编程之socket应用
1 引言 本篇主要对Python下网络编程中用到的socket模块进行初步总结.首先从网络基础理论出发,介绍了TCP协议和UDP协议:然后总结了socket中的常用函数:最后通过实际代码展示基本函数的 ...
随机推荐
- 用keras实现基本的回归问题
数据集介绍 共有506个样本,拆分为404个训练样本和102个测试样本 该数据集包含 13 个不同的特征: 人均犯罪率. 占地面积超过 25000 平方英尺的住宅用地所占的比例. 非零售商业用地所占的 ...
- Hdoj 2563.统计问题 题解
Problem Description 在一无限大的二维平面中,我们做如下假设: 1. 每次只能移动一格: 2. 不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走 ...
- [luogu3878][TJOI2010]分金币【模拟退火】
题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 分析 根据模拟退火的基本套路,先随机分两堆金币 ...
- A/D和D/A的学习
从我们学到的知识了解到,我们的单片机是一个典型的数字系统.数字系统只能对输入的数字信号进行处理,其输出信号也是数字信号.但是在工业检测系统和日常生活中的许多物理量都是模拟量,比如温度.长度.压力.速度 ...
- Loj 103、10043 (KMP统计子串个数)
KMP算法学习链接:https://blog.csdn.net/starstar1992/article/details/54913261/ KMP算法:可以实现复杂度为O(m+n) 为何简化了时间复 ...
- nc 使用实例
nc.exe -h即可看到各参数的使用方法.基本格式:nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostna ...
- 软件补丁问题(SPFA+位运算)
洛谷P2761 1.考虑到所有的错误只有“修复,未修复”两种情况,所以可以用0,1标记压缩状态,采用位运算减少时空浪费. 又考虑到有修复时间的关系,将时间抽象成边,将状态抽象为点(设修复为0,未修复为 ...
- 2.Linux基础命令
linux内一切皆文件,没有文件夹只有目录,目录也是一种文件 1.一些常用按键: 将鼠标的光标从虚拟机里切换回来:Ctrl+Alt 拖动Ubuntu内的对话框:Alt键+鼠标左键拖动 清屏:Ctrl+ ...
- 为什么 管理工具里没有Internet(IIS)管理器选项
如上图,localhost页能打开了,但是管理工具里没有iis管理器,主要原因是安装iis时候没有选择web管理工具,选取安装上就 有了
- matlab图片 latex显示
matlab图片另存为bmp格式,用在线网站转换格式为png. 莫要直接另存为jpg格式,在latex中显示,否则图片显示的质量不高.