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中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
随机推荐
- CodeForces 1420E Battle Lemmings
题意 略. \(\texttt{Data Range:}1\leq n\leq 80\) 题解 首先考虑初始状态怎么算答案.很明显直接数满足的不好数,用总的减去不满足的还比较好做.注意到所有不满足的是 ...
- 时间UTC格式装换php时间格式
date_default_timezone_get("UTC");date("Y-m-d", strtotime("2017-11-13T18:04: ...
- 水题挑战2 :NOIP提高组 2011 聪明的质监员
小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从\(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) .检验矿 ...
- jenkins任务
#################################jenkins任务1.打包.持续集成.部署.定时运行 2.创建自由风格的一个任务 3.一个任务的核心步骤就是,build即创建,即运行 ...
- learning to Estimate 3D Hand Pose from Single RGB Images论文理解
持续更新...... 概括:以往很多论文借助深度信息将2D上升到3D,这篇论文则是想要用网络训练代替深度数据(设备成本比较高),提高他的泛性,诠释了只要合成数据集足够大和网络足够强,我就可以不用深度信 ...
- 利用远程桌面管理winserver集群
在适用mstsc连接winserver服务器的场景下(别问为什么不VNC),可以利用rdp文件等方式减轻连接的操作负担 利用.rdp文件免密登录 rdp文件本质上是一个mstsc的选择,或者不如说ms ...
- php 获取抖音id
<?php public function getid($dy_url){ $header=get_headers($dy_url); $str = "/^.*?(\d+).*/&qu ...
- File 方法
File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用 ...
- QQ群web前端分析二——第一印象
对QQ群WEB进行前端分析 入口是 http://qun.qzone.qq.com/ 以下为第一印象,主要是从我的理解上找问题. ----------------------------------- ...
- CSS之calc()
calc() 函数支持任意CSS长度单位的混合计算,遵循标准数学运算优先级规则,可以动态计算长度值.注意,calc()函数内部的运算符两侧各加一个空白符,否则会产生解析错误. calc()使用的难点在 ...