背景知识
计算机网络由负责数据转发的通信子网和负责运算存储的资源子网所构成。在网络中每一台主机通过IP地址标识,每一个程序在计算机中通过端口号标识。然后通过共有的规则又称为协议才能使得计算机网络等到合理有效地运行。
这里需要注意两点:
1.常用的程序端口号:
web: 80
mysql: 3306
tomcat: 8080
QQ: 4000
oracle:1521
2.协议
UDP:高效、非安全、异步协议,类似于发短信
TCP:三次握手、安全、同步协议,类似于打电话
下面是整个网络的TCP/IP模型
注意:IP和端口号是一个程序的唯一标识,外界就是通过IP+端口号对程序进行访问。协议中TCP和HTTP协议比较重要,其中TCP是HTTP协议的基础。
TCP协议
网络编程就是Socket(套接字)间编程,所谓的套接字就是与IP+Port生成的唯一网络标识。通信的双方(程序)都拥有属于自己的套接字,然后编程就是完成这些套接字之间字节或者字符流的发送和接受。
练习:客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串
客户端程序:
package com.heima.practice;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class MyClient {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/**
* 设置客户端套接字,并向服务器127.0.0.1:80端口发送请求
*/
Socket socket=new Socket("127.0.0.1", 8888);
/**
* 获取输入和输出流
*/
OutputStream os=socket.getOutputStream();
/**
* 向服务器发送请求
*/
String sendMsg="";
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
sendMsg+=sc.next();
}
os.write(sendMsg.getBytes());
/**
* 接受服务器的响应
*/
InputStream is=socket.getInputStream();
byte[] content=new byte[1024];
is.read(content);
int len=content.length;
System.out.println(new String(content,0,len));
//关闭套接字
socket.close();
}
}
服务器端程序
package com.heima.practice;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class MyServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/**
* 设置服务器套接字
*/
ServerSocket server=new ServerSocket(8888);
/**
* 监听8888端口发出的信息
*/
final Socket socket=server.accept();
System.out.println("Server is working!");
while(true){
new Thread(new Runnable() {
@Override
public void run(){
try {
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
/**
*获取输入的字符串
*/
byte[] content=new byte[1024];
is.read(content);
int len=content.length;
/**
* 将字符反转输出
*/
os.write(new StringBuilder(new String(content,0,len)).reverse().toString().getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
实验结果:
这里对多程序的优化(Printer),以及实验的结果还存在一些问题,由于时间问题,需要更正下。