您的位置:首页 > 理论基础 > 计算机网络

34、Android中基于Socket的网络通信(一)

2014-09-16 17:45 525 查看
Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成需要的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。

1,服务器监听。

2,客户端发送请求。

3,建立连接。

4,通信。

【Socket特点】

1,Socket基于TCP连接,数据传输有保障。

2,Socket适用于建立长时间连接。

3,Socket编程通常应用于即时通讯。

 import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;

public class ServerListener extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(12345);
// 循环监听来自客户端的连接
while (true) {
// block
Socket socket = serverSocket.accept();
// 建立连接
JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");

// 因为每个Socket都要与一个客户端进行通信。所以要另起一个新的线程。
// 将Socket传递给新的线程。
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;

/**
* 因为每个Socket都要与一个客户端进行通信。所以要另起一个新的线程。
* 之间是相互独立的,它们之间不能进行数据沟通。
* @author dr
*
*/
public class ChatSocket extends Thread {

Socket socket;

public ChatSocket(Socket s) {
this.socket = s;
}

public void out(String out) {  // 发送数据
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
//        int count = 0;
//        while (true) {
//            count++;
//            out("loop+" + count);
//            try {
//                sleep(500);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
try {
/** 当前的服务器会从客户端不断的读取内容 */
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "UTF-8"));
String line = null;
// 客户端发送给服务端的数据。
while ((line = br.readLine()) != null) {
// 发送给聊天室所有的人。
ChatManager.getChatManager().publish(this, line);
}
br.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


import java.util.Vector;

/**
* 管理新建的线程,实现它们之间的相互通信。  * @author dr
*/
public class ChatManager {

// 单例化
private ChatManager() {
}

private static final ChatManager cm = new ChatManager();

public static ChatManager getChatManager() {
return cm;
}

Vector<ChatSocket> vector = new Vector<ChatSocket>();

public void add(ChatSocket cs) {
vector.add(cs);
}

/**
* 其中的某个线程,可以通过调用这个函数,向其他的客户端发送信息
*
* @param cs
*            线程
* @param out
*            输出的信息
*/
public void publish(ChatSocket cs, String out) {
// 发送给集合中所有的线程。
for (int i = 0; i < vector.size(); i++) {
ChatSocket csChatSocket = vector.get(i);
// 当前的线程就不用接收这条信息了。
if (!cs.equals(csChatSocket)) {
csChatSocket.out(out);
}
}
}

}


 /** 测试类 */
public class MyServerSocket {
public static void main(String[] args) {
// 终端运行测试:telnet localhost 12345;
new ServerListener().start();
}
}




[b]【注】MAC系统中,打开多个终端窗口, command + N 或者 command + T(TAB样式) 。[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: