2017-9-05 - A - 聊天室
1 TCP是什么?什么是丢包?
两个计算机间传输数据的规范,只要遵守,就能互相发送数据。切割成包的数据在传输过程中丢失了。
2 UDP是什么?为何不可靠?常用是哪个?
不可靠传输协议。不确认包是否收到。TCP,UDP占用带宽大,不能保证即时性。
3 C S模式到B S模式的原因是?
客户端过多,用Browser统合。
4 TCP如何进行通讯?Socket是什么?
利用封装的SOCKET类,Socket相当于一个电话,连通后,会提供一个输入流,一个输出流。我的输入流对你的输出流,相反亦是。
5 什么是套接字?
即Socket。
6 为何此处捕捉了异常最后还是抛出了异常?
public Client() throws Exception{
try {
} catch (Exception e) {
throw e;
}
}
此处并没有处理异常,只是为了记录错误日志而捕捉。(异常并不归该代码块处理)
//一般直接抛出即可,由外部调用方法的代码块处理
//在此处感知错误是为了记录错误日志——当需要感知错误时便加try...catch...
public Client() throws Exception{
try {
} catch (Exception e) {
/*将来针对异常可能需要记录日志。所以需要感知错误。但是若异常不应当在这里
* 被处理时可以继续在catch中将其抛出。
*
*/
throw e;
}
}
7 端口号用于?
计算机中有许多应用正在连接网络,服务器通过IP地址传送到本机上,通过端口号判断接收数据的程序。
8 是否需要定义服务器端自身的IP地址和端口?
不需要,系统已封装并创建。
9 public static void main(String[] args) {
10 /*
* 运行在服务端的java.netl.ServerSocket
* 主要有两个作用:
* 1:向系统申请对外的服务端口,客户端Socket就是通过这个端口与服务端程序建立连接的。
* 2:监听该服务端口,一旦一个客户端Socket通过该端口尝试建立联机,ServerSocket就会
* 感知并实例化一个Socket与该客户端进行通讯。
*/
11 服务端开始工作的方法是什么?
public void start(){
try {
/*
* ServerSocket提供方法:
* Socket aeecpt()
* 该方法是一个阻塞方法,用于监听服务端口,直到一个客户端链接上
* 为止,这里会返回一个Socket,通过该Socket就可以与该客户端进行通讯了。
*
*/
Socket socket = server.accept();
} catch (Exception e) {
// TODO: handle exception
}
}
package DAY11;
/**
* 聊天室服务端
* @author admin
*
*/
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
/*
* 客户端与服务端连接传送数据需要符合TCP或UDP协议,而java中用Socket封装了该协议
* 因此创建客户端及服务端时便要实例化Socket对象(电话)用以互相传输数据,
* 客户端的Socket可直接用java.net.Socket新建,而服务端要用java.net.ServerSocket来创建服务端的Socket接口,两个接口不同
* 客户端需要在构造中实例化一个socket对象,实例化socket对象需要传入服务端ip地址和端口号
*/
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/*
* 运行在服务端的java.netl.ServerSocket
* 主要有两个作用:
* 1:向系统申请对外的服务端口,客户端Socket就是通过这个端口与服务端程序建立连接的。
* 2:监听该服务端口,一旦一个客户端Socket通过该端口尝试建立联机,ServerSocket就会
* 感知并实例化一个Socket与该客户端进行通讯。Address Already In Use
*/
private ServerSocket server;
/*
* 服务端构造,用来初始化服务端
*/
public Server() throws Exception{
try {
/*
* 实例化ServerSocket的同时向系统申请服务端口,若当前系统其他应用
* 程序正在使用这个端口,那么这里的实例化会抛出地址被占用的异常。
*
*/
System.out.println("服务端正在启动...");
server = new ServerSocket(8081);
System.out.println("服务端启动完毕。");
}catch(Exception e){
e.printStackTrace();
}
}
/*
* 服务端开始工作的方法
*/
public void start(){
try {
/*
* ServerSocket提供方法:
* Socket aeecpt()
* 该方法是一个阻塞方法,用于监听服务端口,直到一个客户端链接上
* 为止,这里会返回一个Socket,通过该Socket就可以与该客户端进行通讯了。
*
*/
System.out.println("等待客户端连接");
Socket socket = server.accept();//卡在这了
System.out.println("一个客户端连接了...");
/*
*
*/
//用顶级接口接收输入流
InputStream in = socket.getInputStream();
//由于in为字节流,无法直接加载到br(有换行输出)上,所以需要先加载到isr上
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
while(true){
String message = br.readLine();
System.out.println(message);
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
try{
Server server = new Server();
server.start();
}catch(Exception e){
e.printStackTrace();
System.out.println("服务端运行失败");
}
}
}
12 何时需要定义内部类?
属于外部类的一个子功能,需要单创建一个类时,定义在内部。且如果该类仅自己调用,还可定义为私有的。
13 如何同时接受多个客户端的信息?
使用线程,将accept()实例化的socket传入线程中,循环该过程。
14 服务器是如何初始化的?
通过创建ServerSocket对象,该对象用于申请对外的端口及创建Socket用以通讯(监听到请求连接后)
15 线程相当于封装了?
流程。
16 提示需要create method时可能是什么原因?
无 new .
17 打桩技巧——
不要懒,每个点都打,
18 线程之间如何共享数据?
将数据放在公共区域。
19 如何锁对象及判断是否有锁或属性以达到限制访问(互斥)?
synchronized (allOut) {
allOut.add(pw);
}
20 编程思路整理技巧有?
画图。
21 聊天 → 不用回一句就能显示(读写分离) → ip → 回复时间间隔
22 聊天室项目练习5次。
23 如何配置maven的xml文件?
24 字符流,基于低级流(字节流)
25 创建服务器及客户端的思路是?