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();
}
}

【注】MAC系统中,打开多个终端窗口, command + N  或者 command + T(TAB样式) 。

34、Android中基于Socket的网络通信(一)的更多相关文章

  1. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  2. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  3. Android零基础入门第35节:Android中基于回调的事件处理

    原文:Android零基础入门第35节:Android中基于回调的事件处理 通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理. 一. ...

  4. Android 中基于 Binder的进程间通信

    摘要:对  Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...

  5. iOS中基于 Socket 的 C/S 结构网络通信(中)

    结合上一篇的知识.接下来将介绍基于 TCP 协议的 Socket  编程.因为 Socket 须要有client和服务端,那么如今实现的是关于服务端的简单程序.服务端採用的是CFStream 类来实现 ...

  6. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  7. android中利用Socket实现手机客户端与PC端进行通信

    1. 项目截图

  8. Android中利用httpclient进行网络通信的方法(以用户登录为例说明)

    http://www.android100.org/html/201406/09/22915.html 1.服务器端 服务器端和android没有太大关系,对J2EE比较熟悉的话写起来应该很容易,这里 ...

  9. android中基于HTML模板的方式嵌入SWF

    继上一篇 利用webview实现在andorid中嵌入swf 这篇继续说说通过html模板的方式来嵌入SWF,这样做的好处最直观的就是可以把html,swf和android代码串起来,交互操作很方便( ...

随机推荐

  1. Objective-C中的数据类型、常量、变量、运算符与表达式

    1.Objective-C中的数据类型: Objective-C中的基本数据类型有:int.char(-128-127).float.double.BOOL,Byte(0-255) Id类型相当于(等 ...

  2. C# Windows - RadioButton&CheckBox

    RadioButton和CheckBox控件与Button控件有相同的基类,但它们的外观和用法大不相同. RadioButton显示为一个标签,左边是一个圆点,该点可以是选中或未选中.用在给用户提供两 ...

  3. 原生js解决跨浏览器兼容问题

    //跨浏览器兼容问题 Util = { //添加类名 add : function(ele,type,hand){ if(ele.addEventListener){ ele.addEventList ...

  4. Akka官方文档翻译:Cluster Specification

    参加了CSDN的一个翻译项目,翻译Akka的文档.CSDN提供的翻译系统不好使,故先排版一下放在博客上. 5.1 集群规范 注意:本文档介绍了集群的设计理念.它分成两部分,第一部分描述了当前已经实现的 ...

  5. 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)

    2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...

  6. ASP.NET如何使用JSON

    关于json,有一个官网:http://www.json.org 上面介绍了每种语言生成json格式的类库,我们只要把他们下载解压之后调用他们其中的组件即可,在.net中我用的是Newtonsoft. ...

  7. ArcGIS学习记录—KMZ KML与SHP文件互相转换

      1.在google earth中绘制边界  工具栏中选择"Add Polygon".随意绘制一个多边形.  右击添加的图层名(左侧)保存位置为,选择保存为kmz或kml文件.  ...

  8. PHP设计模式浅析

    工厂模式 提到的最多, 用途也最广. 简单说就是: 定义一个用户创建对象的接口. 把创建对象的过程封装起来. 工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它 ...

  9. ArrayList源代码深入剖析

    第1部分 ArrayList介绍ArrayList底层采用数组实现,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, Cloneable, java. ...

  10. 【算法】 输入n 输出一个n*n的zigzag矩阵 利用c++实现

    int main() { int N; cin>>N; int **a = new int *[N]; ) ;//如果没有申请到空间 ;i<N;i++) { a[i]= new in ...