一、网络编程的概念
网络编程!=网站编程
二、为什么要使用socket?
当两个应用程序之间需要交换数据的时候,用socket
三、重要名词解释:
套接字:ip地址+端口号
ip地址:用来唯一标识一台主机
端口号:用来唯一标示一个进程 占两个字节
四、TCP和UDP的区别
TCP:传输控制协议,面向连接的,安全的,有顺序的
UDP:用户数据报协议面向无连接的,不安全的,无顺序的
五.在TCP模式下演示建立端口通道
服务器端口:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//服务器端
public class Server {
public static void main(String[] args) throws Exception {
//Socket编程 共三步 类似打电话
//一.创建socket连接 (拨号并接通)
//1.新建ServerSocket
ServerSocket ss = new ServerSocket(6666);
//3.接受连接
Socket socket=null;
socket = ss.accept();//阻塞式的 傻傻的等待 等待一个客户端连接
System.out.println("有一个客户端相连");
//二.I/O操作 (说话)
System.out.println("************服务器读执行***********");
//1.建立通道
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//2.利用read读
/**/String message = br.readLine();//阻塞式 傻傻的等待 等待客户端写
System.out.println("有客户端给我打招呼,内容是:" + message);
/*String message=br.readLine();
System.out.println("有客户端给我打招呼,内容是:"+message);
System.out.println("************服务器写执行***********");*/
//服务器给客户端说 你坏
//1.建立通道
OutputStream oo = socket.getOutputStream();
//字节流--->字符流
OutputStreamWriter osw = new OutputStreamWriter(oo);
BufferedWriter bw = new BufferedWriter(osw);
//2.利用write写
bw.write("你坏");
bw.write("\n");
bw.flush();
//3.关闭通道
if(oo!=null){
oo.close();
}
if(is!=null){
is.close();
}
//三.关闭socket连接 (挂电话)
if(socket!=null){
socket.close();
}
}
//阻塞 为了等待客户端连接
//有一个客户端相连
//阻塞 为了等待客户端输出 等待6秒
//有客户端给我打招呼,内容是:你好,服务器
}
客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class Client {
public static void main(String[] args) throws Exception
{
String str = "你好,服务器";
// 一.创建socket连接
// 2.申请连接(相当于拨号,但别人不一定接) 系统给该进程自动分配一个端口1024以上
Socket s = new Socket("127.0.0.1", 6666);
//二.I/O操作
System.out.println("************客户端写执行***********");
//1.建立通道
OutputStream oo = s.getOutputStream();
//字节流--->字符流
OutputStreamWriter osw = new OutputStreamWriter(oo);
BufferedWriter bw = new BufferedWriter(osw);
//2.利用write写
bw.write(str);
bw.flush();
System.out.println("************客户端读执行***********");
//客户端接收
InputStream is = s.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//2.利用read读
String message = br.readLine();//阻塞式 傻傻的等待 等待客户端写
System.out.println("服务器说:" + message);
//3.关闭通道
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(is!=null){
is.close();
}
//三.关闭socket连接
if(s!=null){
s.close();
}
}
}
六、下面四种情况肯定关闭socket连接
1.调用socket对象的close()方法
2.如果关闭了socket中的输入输出流,socket也自动关闭
3.应用程序结束后,socket也会自动关闭
4.socket socket=null;socket对象置空,或者是让这个socket对象的引用从新引用一个新的socket对象,原来的socket对象就会变成垃圾,被垃圾回收器回收,内存回收以后,socket就关闭了
七、br.readline():为什么会阻塞?
因为BufferedReader只有碰到\n的时候,才能真正的读进来数据,解决方案是在输入的时候 每行要加一个\n
八、URL、URI和URN三者的区别
URI 统一资源标识符
URL 提供一种找到资源的方式 就像人的地址加名称
URN 只是一个资源的名称 不提供找到资源的方式 就像人名和身份证