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中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ... 
随机推荐
- Mybatis---01Mybatis动态代理过程分析
			1.通过调试,session调用的getMapper是其实现类DefaultSQLSession中的 //1.读取配置文件 InputStream in = Resources.getResource ... 
- 物流一站式单号查询之快递鸟API接口(附Demo源码)
			连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ... 
- MONGODB02 - MongoSocketWriteException 异常会迟到,但从不缺席
			接上一个<MONGODB01 - Prematurely reached end of stream 错误定位及修复>处理完成之后,又报错了,场景也是一段时间不访问MongoDB,突然访问 ... 
- 基于PHP实现短信验证码接口的方法
			步骤: 1.登录荣联运通讯注册获取ACCOUNT SID.AUTH TOKEN.Rest URL(生产).AppID(默认): 2.注册测试用手机号码(先注册测试号码方可使用): 3.下载demo示例 ... 
- scrapyd部署、使用Gerapy 分布式爬虫管理框架
			Scrapyd部署爬虫项目 GitHub:https://github.com/scrapy/scrapyd API 文档:http://scrapyd.readthedocs.io/en/stabl ... 
- day86:luffy:前端发送请求生成订单&结算页面优惠劵的实现
			目录 1.前端发送请求生成订单 1.前端点击支付按钮生成订单 2.结算成功之后应该清除结算页面的数据 3.后端计算结算页面总原价格和总的真实价格并存到数据库订单表中 2.优惠劵 1.准备工作 2.前端 ... 
- 8. Prism导航
			1. 背景 导航是为了实现不同界面的切换,是一种组织系统功能的方式.提供两种导航,一是基于View切换,二是基于ViewModel状态. 2. 基于View切换的导航 最常用导航方式.在该种导航中首先 ... 
- Cassandra数据模型和模式(Schema)的配置检查
			免责声明 本文档提供了有关DataStax Enterprise(DSE)和Apache Cassandra的常规数据建模和架构配置建议.本文档需要DSE / Cassandra基本知识.它不能代替官 ... 
- Redis学习(一)——初识Redis
			1.Redis是什么 1)REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. 2)Redis的特点 Red ... 
- powershell渗透-信息收集命令
			powershell渗透-信息收集命令 本文包含从 Internet 的各个角落收集的 PowerShell 命令列表,这些命令在渗透测试或红色团队练习期间可能会有所帮助. 该列表包括各种开发后的单行 ... 
