5月14日学习总结——基于TCP协议的Socket编程

1、基于TCP协议的序列化传输

第一:先创建一个用户类User并且实现Serializable接口,拥有序列化的能力

第二:创建一个客户类

第三:创建一个主机类

第四:创建主机的线程类

如何创建一个客户类:

首先先将关键字socket出来,需要传入的参数有,主机的IP地址,和对应的端口号

然后用socket.get 获取输出流

将输出流作为参数,创建序列化流,objectoutputstream

然后实例化对象,并将其传给主机端,使用socket.shutdowmoutput()关闭输出流,

若主机端收到将回复信息,于是创建一个输入流用socket.get获取,将其包装成BufferedReader

然后将主机的回复的内容写出来。


如何创建一个主机类:

先new出serversocket,传入固定端口

采用while(true)循环在其中进行监听,假如有客户请求,则实例化一个对应线程,将socket作为参数传入

如何创建线程类:

自定义一个socket属性,并创建构造方法,必要参数为socket

创建输入流,读取客户信息,创建输出流,给用户回复

关闭所有资源,释放资源


代码演示:(这个是包含了dowhile 循环的多次通话的)

 * 顾客类,向淘宝客服询问问题
 * 
 *
 */
public class LoginClient {
public static void main(String[] args) {
OutputStream os = null;
BufferedWriter bw = null;
InputStream is = null;
BufferedReader br = null;
try {
//先确定我们需要访问的客服地址
Socket socket = new Socket("localhost", 5000);
//然后把我们的请求发给他
os = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(os));
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
Scanner input =new Scanner(System.in);
do {
System.out.println("请输入你要发送的消息(y退出):");
String info = input.next();
if (info.equals("y")) {
return;
}

bw.write(info);
//暂时关闭输出资源,然后等待客服的回复
os.flush();
bw.flush();
String str = null;

while((str = br.readLine())!=null){
System.out.println(str);
}

} while (true);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (br!=null) {
br.close();
}
if (is!=null) {
is.close();
}
if (bw!=null) {
bw.close();
}
if (os!=null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}

}

 * 客服类,回答客户问题,每个顾客对应一名顾客
 * 
 *
 */
public class LoginServer {
public static void main(String[] args) {
//这个只监视一个接口
try {
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
Socket socket = serverSocket.accept();
MyThread thread = new MyThread(
socket);
thread.start();

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}

* 客服需要做的事情,有客户来咨询就给回复
 * @author 金前旺
 *
 */
public class MyThread extends Thread{
private Socket socket;
public MyThread(Socket socket) {
super();
this.socket = socket;
}

public void run() {
InputStream is = null;
BufferedReader br = null;
OutputStream os = null;
BufferedWriter bw = null;
try {
//顾客来访问了,我们先接收问题
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
os = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(os));
do {
String info = null;
while((info = br.readLine())!=null){
System.out.println(info);
}

//问题接受完毕,我们要根据问题来进行回复亲
Scanner input = new Scanner(System.in);
System.out.println("请输入回复的话(y退出):");
String str = input.next();
if (str.equals("y")) {
return;
}
bw.write(str);
bw.flush();
os.flush();

} while (true);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if (bw!=null) {
bw.close();
}
if (os!=null) {
os.close();
}
if (br!=null) {
br.close();
}
if (is!=null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭