学jsp,老师就先学到了套接字编程,刚开始不太明白,快考试了,再拿出来看看,就明白很多了。所以当你不明白一个东西的时候可以试着先放下,回头看看就会发现自己进步很多。
客户端实现代码如下
package Socket1;import java.net.*;
import java.util.Scanner;
import java.io.*;
public class Client_Socket {
static void main(String[] args) throws IOException {
InetAddress addr = InetAddress.getByName(null);//
// addr是包含主机名和ip地址的对象,该行代码在新建对象的同时把new封装起来,但是为什么要封装?
//(addr是InetAddress的一个对象,addr之所以包含主机名和ip地址的对象,是因为InetAddress这个类里面写了方法,
//包括主机名和ip的get和set方法,相当于主机名和ip是addr的属性,封装起来是为了不让外部的人能够修改这两个属性或者删除它们,
//其实就是为了加强安全性)类似装饰器那样可以在原始功能上更强大想要实现的结果.
System.out.println("addr = " + addr);
Socket socket = new Socket(addr, Server_Socket.PORT);
// 通信的连接,自然需要一个端口(标识服务器上的程序类似于电话号码的一个分机号),因为我们已经获取了一个ip地址
//(定位某台电脑类似一个电话号的主机)。Port是一个端口的参数。
try {
System.out.println("socket = " + socket.toString());
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
// 输出流。字节流—封装—字符流---带缓冲功能(以提高输出的速度)--制造一个缓冲区,才不会让输出流每次都要等到有数据过来才输出,会浪费很多时间,
//那些时间输出流完全可以去做别的事情
Scanner scan = new Scanner(System.in);
// 从键盘输入
for (int i = 0; i < 10; i++) {
String userinput = scan.nextLine();// 阻塞调用
out.println(userinput);// 向服务器发送数据
String str = in.readLine(); // 阻塞调用
System.out.println(str);
}
out.println("END");
} finally {
System.out.println("closing...");
socket.close();
}
}
}
这是用一个try-finally块实现的。这是用一个try-fina
服务器端口代码如下:
// Server_Socket.java
package Socket1;import java.io.*;
import java.net.*;
public class Server_Socket {
public static final int PORT = 8080;
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);// 通过绑定端口号创建监听套接字,它只是起到监听客户端的请求,不接收任何数据包
System.out.println("Started: " + s);
try {
Socket socket = s.accept();// 等待客户端请求的到来,成功后会返回一个套接字socket,并调用accept()。这才是通信的套接字。
// 创建一个server-socket,只需为其赋予一个端口编号,不必把一个ip地址分配给它,因为它已经在自己代表的那台上了,但在创建一个socket,却必须同时赋予ip地址以及要连接的端口编号。(s.accept()包含了所要的信息)
try {
System.out.println("Connection accepted: " + socket);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
// 这里的true的作用是在调用out.println的时候会自动清空字符。
// 防止缓冲区不会满,true的作用是否是缓冲区的清空。。。
while (true) {
String str = in.readLine();
if (str.equals("END"))
break;
System.out.println("Echoing: " + str);
out.println(str + str + " haha");// 向客户端发送数据
}
} finally {
System.out.println("closing...");
socket.close();
}
} finally {
s.close();
}
}
}