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

  1. java基础之Socket编程概述以及简单案例

    概述: 用来实现网络互连的 不同的计算机上 运行的程序间 可以进行数据交互  也就是用来在不同的电脑间, 进行数据传输. 三大要素: IP地址: 设备(电脑,手机,ipad)在网络中的唯一标识. 组成 ...

  2. Java基础教程——UDP编程

    UDP:User Datagram Protocol,用户数据报协议 服务端: import java.net.*; import java.io.*; public class UdpServer ...

  3. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  4. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

  5. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...

  6. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  7. Java基础教程:面向对象编程[3]

    Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...

  8. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  9. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

随机推荐

  1. Spring 最常用的 7 大类注解,哪些你还不知道?

    随着技术的更新迭代,Java5.0开始支持注解.而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架. 而spring的的注解那 ...

  2. Struts2 S2-059 (CVE-2019-0230 )复现 及流量分析、特征提取

    一.简介 2020年08月13日,Apache官方发布了Struts2远程代码执行漏洞的风险通告,该漏洞编号为CVE-2019-0230,漏洞等级:高危,漏洞评分:8.5 二.漏洞描述 Struts2 ...

  3. git 出现 error: bad signature fatal: index file corrupt

    一次大改版,提交了很多代码,但再次提交提交不了,也拉不下来仓库的代码 提示error bad signature fatal: index file corrupt 在项目有.git这同级打开Git ...

  4. 安装 Homebrew&iterm2&Oh My Zsh

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/instal ...

  5. python栈、队列、文件目录遍历

    一. 栈与队列 关注公众号"轻松学编程"了解更多. 1. 栈 stack 特点:先进先出[可以抽象成竹筒中的豆子,先进去的后出来] 后来者居上 mystack = [] #压栈[向 ...

  6. soloPi安装使用

    SoloPi脚本转化器正式发布,支持转化为 Appium 与 Macaca 脚本:https://github.com/soloPi/SoloPi-Convertor,脚本转化器使用教程: https ...

  7. XX-Net 解决IPV6 不稳定,时好时坏。

    一.启动IPV6 1.重置: netsh interface Teredo set state disable netsh interface Teredo set state type=defaul ...

  8. 测试流程规范--测试准入、准出、停止标准、bug优先级定义

    一.背景 最近在推进组内流程规范专项建设,从"研发测试流程"."提测规范"."测试准入标准"."bug优先级标准".&q ...

  9. CF295C Greg and Friends

    首先 我们考虑每次船来回运人时都可以看成一种dp状态 又因为人的体重只有50kg和100kg两种, 所以我们可以开一个三维数组dp[i][j][k],第1维表示在出发岸50kg有i个,第2维表示在出发 ...

  10. EVM 2.0 预览版,跃见非凡,源于鸿蒙,开启物联网小程序新时代

    1. 基于EVUE的物联网小程序 EVM诞生以来,一直致力于让物联网开发变得简单,自鸿蒙OS 1.0 发布后,最引人注目的莫过于华为在应用程序开发框架层面面向应用开发者提供了一种全新的开发方式: 框架 ...