简介
网络编程,其实质是实现两台不同计算机之间的数据传递,将其分为客户端和服务器端。
客户端:如手机App、浏览器、QQ等
服务器端:主要是存储和处理数据

IP地址:唯一标识某一台电脑
端口号:唯一标识电脑的某一个进程(程序)80
网络中的数据传输:Socket实现->套接字
Socket类:客户端
ServerSocket类:服务器端
目录
1.网址解析
2.Socket和ServerSocket的简单使用
3.Socket实现对话聊天
详解
1.网址解析
在浏览器中输入网址:http://www.baidu.com.search?code=android,这个网址(即URL:统一的资源定位)就包含以下几个部分:
1.http/https :传输协议 TCP/IP
2.www.baidu.com: 域名 ,表示一台网络中的电脑
域名其本质是 IP(ipv4、ipv6)地址:唯一标识一台网络中的电脑
一个域名只能对应一个IP地址,而一个IP地址可对应多个域名
3.search :对应的后台程序文件,如 php、java、jsp
4.?:表示运行这个程序需要传递的参数
5.code=android ,code是服务器端规定的字段,如果有多个参数使用&符号连接
2.Socket和ServerSocket的简单使用
创建两个类,分别模拟Client(客户端)和Server(服务器端)
1.在Server里创建ServerSocket对象,确定端口号,并记录连接的Client
class Server {
public static void main(String[] args) throws IOException {
// 创建服务器端的ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
// 监听客户端连接
// 当有客户端来连接这个服务器 就可以得到对应的socket
// 当没有客户端来连接 服务器一直在这里等待
Socket clientSocket = serverSocket.accept();
}
}
2.在Client里面创建Socket对象,模拟客户端连接服务器
注意:127.0.0.1是自己电脑的本地回路
class Client {
public static void main(String[] args) throws IOException {
// 连接服务器 获取socket
Socket socket = new Socket("127.0.0.1", 9999);
}
}
3.连接成功后向Client客户端返回一句话,然后客户端向服务器上传一张图片,服务器将传递来的图片以文件形式储存
Client客户端
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
class Client{
public static void main(String[]args) throws IOException {
// 连接服务器 获取socket
Socket socket = new Socket("127.0.0.1",9999);
// 创建服务器端对应的输入流 用于接收服务器端传递来的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
// 向服务器端发送文件(图片)
// 1.将文件读取进内存
FileInputStream fis = new FileInputStream("C:\\Users\\Inuyasha\\Desktop\\yan.jpg");
// 2.将文件输出到服务器端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
// 3.将文件的内容一点一点的传输给服务器
byte[] data = new byte[1024];
int len = -1;
while ((len = fis.read(data)) != -1){
bos.write(data, 0, len);
}
// 关闭输出
socket.shutdownOutput();
}
}
Server服务器端
class Server{
public static void main(String[]args) throws IOException {
// 创建服务器端的ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
// 监听客户端连接
// 当有客户端来连接这个服务器 就可以得到对应的socket
// 当没有客户端来连接 服务器一直在这里等待
Socket clientSocket = serverSocket.accept();
// 创建客户端对应的输出流 用于向客户端发送数据
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println("连接成功!!!");
// 创建客户端对应的输入流 用于接收客户端传递来的数据
BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
// 文件对应的输出流
FileOutputStream fos = new FileOutputStream("C:\\Users\\Inuyasha\\Desktop\\ServerReceive\\yan.jpg");
byte[]data = new byte[1024];
int len = -1;
while ((len = bis.read(data)) != -1){
fos.write(data, 0, len);
}
clientSocket.shutdownOutput();
}
}
3.Socket实现对话聊天
1.一个类实现Runnable接口,用于接收对方传来的数据
// 创建一个子线程处理socket对应端接收服务器端的数据
class ReceiveThread implements Runnable{
// 保存操作的socket对象
private Socket socket;
public ReceiveThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
try {
// 获取socket对应的的输入流对象
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 读取数据
String receiveStr = new String();
while ((receiveStr = br.readLine()) != null){
System.out.println(receiveStr);
}
} catch (IOException e) {
System.out.println("网络出错");
System.exit(-1);
} finally {
try {
if (br != null){
br.close();
}
if (socket != null){
socket.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
}
2.创建Server服务器端
class Server{
public static void main(String[]args) throws IOException {
// 创建服务器
ServerSocket serverSocket = new ServerSocket(9999);
// 监听连接了的客户端
Socket cliertSocket = serverSocket.accept();
//创建子线程 处理客户端传递来的数据
new Thread(new ReceiveThread(cliertSocket)).start();
// 终端输入流对象
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
// 客户端输出流
PrintStream ps = new PrintStream(cliertSocket.getOutputStream());
// 读取终端的输入 将输入传递给客户端
String sendStr = new String();
while ((sendStr = keyin.readLine()) != null){
ps.println(sendStr);
}
}
}
3.创建Client客户端
class Client{
public static void main(String[]args) throws IOException {
// 连接服务器端
Socket socket = new Socket("127.0.0.1",9999);
// 用一个子线程处理服务器端传递来的数据
new Thread(new ReceiveThread(socket)).start();
// 从终端接收数据 发送个服务器端
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
PrintStream ps = new PrintStream(socket.getOutputStream());
String sendStr = new String();
while ((sendStr = keyin.readLine()) != null){
ps.println(sendStr);
}
}
}
将两个两个类同时运行,实现效果:

总结
网络实现的功能神奇,但其使用却是不难,只是需要灵活地运用。当传递大的视频等文件时,通常都需要创建Thread子线程来完成,以免阻塞主线程。以上介绍的只是简单使用,想要深入了解,还需要学习许多。
