网络编程之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的更多相关文章

  1. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  2. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  3. [深入浅出Cocoa]iOS网络编程之Socket

    http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   [深入浅出Co ...

  4. 网络编程之Socket代码实例

    网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...

  5. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

  6. java网络编程之Socket编程

    概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...

  7. Java 网络编程之 Socket

    ========================UDP============================= UDP---用户数据报协议,是一个简单的面向数据报的运输层协议. UDP不提供可靠性, ...

  8. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  9. Python网络编程之socket应用

    1 引言 本篇主要对Python下网络编程中用到的socket模块进行初步总结.首先从网络基础理论出发,介绍了TCP协议和UDP协议:然后总结了socket中的常用函数:最后通过实际代码展示基本函数的 ...

随机推荐

  1. 【比赛】NOIP2018 货币系统

    可以发现最后的集合一定是给定集合的子集 所以就变成了裸的背包嘛,对于每个数判断它能不能被其它数表示出来,如果可以,就表示这个数是没用的,可以去掉 #include<bits/stdc++.h&g ...

  2. 缺省源和 Vim 配置

    缺省源 #include <bits/stdc++.h> #define x first #define y second #define pb push_back #define mp ...

  3. [luogu3246][bzoj4540][HNOI2016]序列【莫队+单调栈】

    题目描述 给定长度为n的序列:a1,a2,...,an,记为a[1:n].类似地,a[l:r](1<=l<=r<=N)是指序列:al,al+1,...,ar-1,ar.若1<= ...

  4. PHP-FPM监控shell

    !/bin/bash #监控的网页地址url="http://dev2.jwsmed.com" #fastcgi启动/重启/停止脚本路径PROG=/data/fistsoft/ph ...

  5. [CERC2017]Intrinsic Interval(神仙+线段树)

    题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间. 题解 做法太神了,根本想不到. %%%i207m. 结论:当一个区间 ...

  6. 20165223 《JAVA程序设计》第三周学习总结

    教材学习内容总结 第四章是整个JAVA语言的基础和重点,要重点学习和把握. 第四章要点 基础 类 构造方法与对象的创建 类与程序的基本结构 重点 参数传值 对象组合 JAVA独有语法 实例成员与类成员 ...

  7. Markdown基础(内含:锚点使用,使用HTML,新页面跳转,目录生成)

    Github样式显示参考:点我 之前说过用word写文章,这次说说Markdown写文章(推荐) 逆天推荐使用VSCode编写 装这个插件写作更方便: 内含:锚点使用,使用HTML,新页面跳转,目录生 ...

  8. Manjaro下Steam无法启动

    问题描述 直接在桌面环境运行Steam,不会出现任何反应,甚至没有闪过一个对话框. 在终端中运行Sterm,出现以下提示 Repairing installation, linking /home/z ...

  9. BZOJ3881 Divljak

    解:对被包含的那些串建AC自动机. 每次加一个串,就在AC自动机上面跑,可知能够跑到一些节点. 这些节点都是一些前缀的形式,我们跳fail树就是跳后缀,这样就能够得到所有能匹配的子串. 我们分别对AC ...

  10. django orm跨表查询废话最少最精简版

    在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...