TCP传输
客户端建立的过程。
- 创建tcp客服端socket服务。使用的是Socket对象。
建议改对象一创建就明确目的地。要连接的主机。 - 如果连接建立成功,说明数据传输通道已建立。
该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入,也有输出。
想要输入或者输出流对象,可以找Socket来获取。
可以通过getOutputStream(),和getInputStream()来获取两个字节流。 - 使用输出流,将数据写入。
- 关闭资源
** 代码演示 **
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客服端socket服务。
Socket socket = new Socket("192.168.0.101",10002);
//获取socket流中的输出流
OutputStream out = socket.getOutputStream();
//使用输出流将指定的数据写出去
out.write("tcp演示,哥们来了!".getBytes());
//关闭资源
socket.close();
}
}
服务端建立的过程。
- 创建服务端socket对象,通过ServerSocket对象
- 服务端必须对外提供一个端口,否则客服端无法连接。
- 获取连接过来的客服端对象
- 通过客户端对象获取socket流读取客户端发过来的数据并打印到控制台上。
- 关闭资源。关客户端,关服务端。
** 代码演示 **
public class ServerDamo {
public static void main(String[] args) throws IOException {
//服务端接收客户端发送过来的数据,并打印到控制台上。
//1.创建服务端对象
ServerSocket ss = new ServerSocket(10002);
//2.获取连接过来的客服端对象
Socket s = ss.accept();//阻塞式
String ip = s.getInetAddress().getHostAddress();
//3.通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(ip+":"+new String(buf,0,len));
s.close();
ss.close();
}
}
创建一个英文大写转换服务器。
客户端输入字母数据,发送给服务端。
服务端收到后显示在控制台,并将数据转换成大写返回给客户端。
直到客户端输入over,转换结束。
代码演示
public class TransClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端连接
Socket socket = new Socket("192.168.0.101",10004);
//获取控制台的信息
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//获取socket流中的输出流
PrintStream out = new PrintStream(socket.getOutputStream());
//获取输入流
InputStream in = socket.getInputStream();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line=bufr.readLine()) != null) {
if(line.equals("over"))
break;
//获取一行数据发送给服务端
out.println(line);
//从服务端接收一行数据并打印到控制台
System.out.println(bufIn.readLine());
}
socket.close();
}
}
public class TransServer {
public static void main(String[] args) throws IOException {
//创建服务端Socket
ServerSocket ss = new ServerSocket(10004);
//获取连接过来的客户端对象
Socket socket = ss.accept();
System.out.println(socket.getInetAddress().getHostAddress()+":"+"连接");
//获取socket的输入流
InputStream in = socket.getInputStream();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(in));
//获取socket流中的输出流
PrintStream out = new PrintStream(socket.getOutputStream());
//读取数据
String line = null;
while((line = bufIn.readLine()) != null) {
System.out.println(line);
String upperCase = line.toUpperCase();
out.println(upperCase);
}
socket.close();
ss.close();
}
}
上传图片到服务端
客户端
public class UploadPicClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//获取客户端连接
Socket socket = new Socket("192.168.0.101",10005);
//获取客户端要上传的文件
FileInputStream fis = new FileInputStream("D:\\IOtest\\1.png");
//获取socket流的输出流
OutputStream out = socket.getOutputStream();
//发送数据
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf)) != -1) {
out.write(buf,0,len);
}
//告诉服务端说,这边的数据发送完毕,让服务端停止读取
socket.shutdownOutput();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String text = bufIn.readLine();
System.out.println(text);
out.close();
socket.close();
}
}
服务端
为实现多人同时访问,需加入多线程
public class UploadPicServer {
public static void main(String[] args) throws IOException {
//获取服务端连接
ServerSocket ss = new ServerSocket(10005);
while(true) {
//获取连接过来的客户端对象
Socket socket = ss.accept();
new Thread(new UploadPicThread(socket)).start();
}
}
}
public class UploadPicThread implements Runnable{
public Socket socket;
public UploadPicThread(Socket socket) {
this.socket = socket;
}
public void run() {
InputStream in;
try {
//获取socket的输入流
in = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("1.png");
//读取发送过来的文件并保存到服务端
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf)) != -1) {
fos.write(buf,0,len);
}
//创建输出流
PrintStream pOut = new PrintStream(socket.getOutputStream());
pOut.println("上传成功");
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
URL
URI统一资源标识符,URL统一资源定位符
URL是一种URI
网络结构
-
C/S client/server
特点:- 该结构的软件,客户端服务端都需要编写。
- 开发成本较高,维护较为麻烦。
好处:
- 客户端在本地可以分担一部分运算。
-
B/S browser/server
特点:- 该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。
- 成本相对较低,维护更为简单。