Java基础教程——Socket编程
Socket通常也称作“套接字”,用于描述IP地址和端口,可以用来实现不同虚拟机或不同计算机之间的通信。
——百度百科套接字允许应用程序插入到网络中,并与插入到网络中的其他应用程序通信。
——《TCP/IP Socket编程·TCP/IP in C》
Socket编程示意图:

服务器需要先启动,等待客户端连接。
客户端主动连接服务器,连接成功才能通信。
字节流版本
服务端:
import java.net.*;
import java.io.*;
public class Skt字节流S {
public static void main(String[] args) {
try {
ServerSocket sSocket = new ServerSocket(8888);
System.out.println("new ServerSocket");
Socket s = sSocket.accept();
System.out.println("accept()");
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String str = new String(b, 0, len);
System.out.println("客户端说:" + str);
os.write("对不起,我们这三碗不过岗".getBytes());
is.close();
os.close();
s.close();
sSocket.close();
System.out.println("服务器端,OVER");
} catch (Exception e) {
}
}
}
客户端:
import java.net.*;
import java.io.*;
public class Skt字节流C {
public static void main(String[] args) {
try {
// Socket s = new Socket(InetAddress.getLocalHost() , 8888);
Socket s = new Socket("127.0.0.1", 8888);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
os.write("你好,我要10碗酒,三斤牛肉".getBytes());
byte[] b = new byte[1024];
int len = -1;
while ((len = is.read(b)) > 0) {
String str = new String(b, 0, len);
System.out.println("服务器端的回复:" + str);
}
is.close();
os.close();
s.close();
System.out.println("客户端Over");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
看效果时,可以一个程序用Eclipse启动,一个用cmd启动,编译时如果有错,可用如下语句:
javac -encoding utf-8 XXX.java
cmd运行程序时,不要有包名。
字符流版本
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SktCharacterS {
public static void main(String[] args) {
try {
ServerSocket sSocket = new ServerSocket(8888);
Socket s = sSocket.accept();
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bufR = new BufferedReader(isr);
PrintWriter prtW = new PrintWriter(os);
// -----------------------------------------------------
String str = bufR.readLine();
System.out.println("——" + str);
prtW.print("你好,我是服务器");
prtW.flush();
bufR.close();
isr.close();
is.close();
prtW.close();
os.close();
s.close();
sSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SktCharacterC {
public static void main(String[] args) {
Socket s;
try {
s = new Socket(InetAddress.getLocalHost(), 8888);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
PrintWriter prtW = new PrintWriter(os);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bufR = new BufferedReader(isr);
// --------------------------------------------------
prtW.println("你好我是客户机");
prtW.flush();
String str = bufR.readLine();
System.out.println("——" + str);
bufR.close();
isr.close();
is.close();
prtW.close();
os.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
socket发送文件(基本款)
服务端:
import java.net.*;
import java.io.*;
public class SktFileS {
public static void main(String[] args) {
try {
ServerSocket sSocket = new ServerSocket(8888);
Socket s = sSocket.accept();
InputStream ips = s.getInputStream();
FileOutputStream fos = new FileOutputStream("recv.png");
byte[] b = new byte[1024];
int nLen = -1;
while (true) {
nLen = ips.read(b);
if (nLen == -1) {
break;
}
fos.write(b, 0, nLen);
}
fos.close();
ips.close();
s.close();
sSocket.close();
} catch (Exception e) {
} finally {
System.out.println("服务器端,OVER");
}
}
}
客户端:
import java.net.*;
import java.io.*;
public class SktFileC {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream ops = s.getOutputStream();
FileInputStream fis = new FileInputStream("send.png");
byte[] b = new byte[1024];
int nLength = -1;
while ((nLength = fis.read(b)) > 0) {
ops.write(b, 0, nLength);
}
fis.close();
ops.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("客户端Over");
}
}
}
socket发送文件(带文件名)
服务端:
import java.net.*;
import java.io.*;
public class SktFileWithNameS {
public static void main(String[] args) {
try {
ServerSocket sSocket = new ServerSocket(8888);
Socket s = sSocket.accept();
InputStream ips = s.getInputStream();
InputStreamReader isr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(isr);
// 读取文件名
FileOutputStream fos = new FileOutputStream("recv_" + br.readLine());
// 读取文件
byte[] b = new byte[1024];
int nLen = -1;
while (true) {
nLen = ips.read(b);
if (nLen == -1) {
break;
}
fos.write(b, 0, nLen);
}
fos.close();
ips.close();
s.close();
sSocket.close();
} catch (Exception e) {
} finally {
System.out.println("服务器端,OVER");
}
}
}
客户端:
import java.net.*;
import java.io.*;
public class SktFileWithNameC {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
// 输出流
OutputStream ops = s.getOutputStream();
PrintWriter pw = new PrintWriter(ops, true);
// 文件读入
String strFile = "send.png";
File f = new File(strFile);
FileInputStream fis = new FileInputStream(f);
// 写文件名
pw.println(f.getName());
// 文件内容发送
byte[] b = new byte[1024];
int nLength = -1;
while ((nLength = fis.read(b)) > 0) {
ops.write(b, 0, nLength);
}
pw.close();
fis.close();
ops.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("客户端Over");
}
}
}
Java基础教程——Socket编程的更多相关文章
- java基础之Socket编程概述以及简单案例
概述: 用来实现网络互连的 不同的计算机上 运行的程序间 可以进行数据交互 也就是用来在不同的电脑间, 进行数据传输. 三大要素: IP地址: 设备(电脑,手机,ipad)在网络中的唯一标识. 组成 ...
- Java基础教程——UDP编程
UDP:User Datagram Protocol,用户数据报协议 服务端: import java.net.*; import java.io.*; public class UdpServer ...
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- Java基础教程:面向对象编程[1]
Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...
- Java基础教程:JDBC编程
Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...
- Java基础教程:面向对象编程[3]
Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
随机推荐
- 如何将Docker升级到最新版本
很早以前,已经使用过了Docker了,但是没有使用过 Docker 部署 NetCore 3.1 的应用程序,今天部署的时候发生了一些问题,解决办法:Docker 版本太低了,那就升级一下.下面是具体 ...
- MyBatis 原理浅析——基本原理
前言 MyBatis 是一个被广泛应用的持久化框架.一个简单的使用示例如下所示,先创建会话工厂,然后从会话工厂中打开会话,通过 class 类型和配置生成 Mapper 接口的代理实现,最后使用 Ma ...
- sync_with_stdio(false)的副作用
sync_with_stdio()的一个特性 水一篇随笔 其实对于用快读的大佬来说没什么用,但还是提一下 ios::sync_with_stdio(false)用处是"关闭同步", ...
- Java_Stringbuilder和StringBuffer
StringBuilder和StringBuffer非常类似, 均代表可变的字符串序列. 这两个类都是抽线类AbstractStringBuilder的子类, 方法几乎一样 /******String ...
- GROUP BY 分组后得到最新即时间最大的一条数据(需添加limit才可生效)
当使用GROUP BY 分组,默认返回的数据是组中最小的记录即id最小的数据, 当开发中经常会需要分组后将最新的数据放在前面, 为了实现需求,使用了嵌套查询,分别使用order by来排序 SELEC ...
- python风格代码荟萃
今天总结一下在python中常用的一些风格代码,这些可能大家都会用,但有时可能也会忘记,在这里总结,工大家参考~~~ 先点赞在看,养成习惯~~~ 标题遍历一个范围内的数字 for i in xrang ...
- 内网渗透 day4-meterpreter基本命令
meterpreter基本命令 目录 1.getuid 查看当前用户 1 2.getpid 查看当前的进程id 1 3.getsystem 初步提权 1 4.ps 1.查看进程列表2.帮助我们获取pi ...
- TCP/IP模型简介和/etc/hosts文件说明
软件=协议的实现. IP决定了主机的位置.端口号决定了进程的位置. 两台主机上的通讯实际是两台主机上两个具体进程的通讯. TCP/IP模型分四层: TCP/IP模型:应用层---传输层----网络层- ...
- 解密Cookie,这一篇就够了
一.Cookie介绍 因为HTTP协议是无状态的,每次请求都是独立的,服务器端无法判断两次请求是否来自同一个用户,进而也就无法判断用户的登录状态,也不知道用户上一次做了什么.所以Cookie就是用来绕 ...
- 利用火焰图分析ceph pg分布
前言 性能优化大神Brendan Gregg发明了火焰图来定位性能问题,通过图表就可以发现问题出在哪里,通过svg矢量图来查看性能卡在哪个点,哪个操作占用的资源最多 在查看了原始数据后,这个分析的原理 ...