socket的使用和 Mina框架
1.编程实现服务器和客户端之间建立连接,用Socket
服务器端:
package com.weikang.server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) {//main方法里的代码都是静态的,所以把start方法体写在其他方法里,用main方法调用
// TODO Auto-generated method stub
SocketServer server = new SocketServer();
server.startServer();
}
public void startServer(){
ServerSocket serverSocket = null;//初始化一个ServerSocket对象
BufferedReader bufferedReader = null;//初始化一个BufferedReader对象,用于读取从Socket输入流里传送过来的信息
Socket socket =null;//初始化一个socket对象
BufferedWriter writer = null;//定义BufferedWriter对象,用于读取输入信息,并传送到Socket输出流
try {
serverSocket = new ServerSocket(9899);
System.out.println("server started...");
socket = serverSocket.accept();//打断再次,直到有客户端接入
System.out.println("client" + socket.hashCode() +"connected");//打印提示有客户端接入了
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得从客户端传送过来的信息
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String receivedmMsg ;
while (((receivedmMsg = bufferedReader.readLine())!=null)) {
System.out.println(receivedmMsg);
writer.write("收到了:\"" + receivedmMsg+"\"\n");
writer.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
writer.close();
serverSocket.close();
bufferedReader.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户端代码
package com.weikang.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args){
SocketClient client = new SocketClient();
client.start();
}
public void start(){
BufferedReader inputReader =null;
BufferedWriter writer = null;
Socket socket = null;
BufferedReader socketReader = null;
try {
socket = new Socket("127.0.0.1",9899);
startServerReplyListener(socketReader);
System.out.println("连接到了服务器...");
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
inputReader = new BufferedReader(new InputStreamReader(System.in));
String inputContent;
while (!(inputContent = inputReader.readLine()).equals("bye")) {
writer.write(inputContent+"\n");
writer.flush();
String response = socketReader.readLine();
System.out.println(response);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
socketReader.close();
socket.close();
inputReader.close();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void startServerReplyListener(final BufferedReader reader){
new Thread(){
public void run() {
String response = null;
try {
while ((response = reader.readLine())!=null) {
System.out.println(response);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
与服务器端差不多
- 其实我觉得我写上代码也没啥意思,,以后返回来看的时候也不会看代码吧,,,,,,
- 总之就是用了原生态的方法实现了服务器和一个客户端之间的长连接,,恩,,是这样,
- 后面再学习框架的方法实现服务器客户端的多个长连接
用原生方式写的过程中,连接多个客户端出现了一个Bug
- 具体表现为:每个客户端只能与服务器发送一次消息,
- 经过各种Dubug,发现了问题所在, 以上代码是存在问题的,如果在等待输入的时候进入while循环.在while循环里打印出从服务器获得的消息.而不是从写的那个监听器里打印出来的,会导致,在while循环等待的过程中,内部打印从服务器获取消息的那一行还在等待从服务器发来消息,导致从控制台输入无效,发送不到服务器!
socket总结
socket是阻塞式的,,确实不咋地,,所以爆出了我上面的各种错误
其实Java1.4以上的版本中Java都封装了一个工具java.nio,但是操作特别复杂,用的人也不是很多.所以一些大牛就在nio的基础上有封装了一些操作简单的框架,Mina为例—-接下来学习,Mina初体验