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

android的SOCKET网络编程

2015-05-17 23:04 337 查看
Socket又称套接字,应用程序通常通过“套接字”向网络发出请

求或者应答网络请求

在JAVA中,Socket和ServerSocket类库位于java.net中。

ServerSocket用于服务器端,Socket是建立网络时使用的。在连

接成功时,应用程序两端都会产生一个Socket实例,操作这个实

例,完成所需的会话。对于一个网络连接来说,

套接字是平等的

,并没有差别,不因为在服务器端或在客户端而产生不同级别。

不管是Socket还是ServerSocket他们的工作都是通过Socket类及

其子类来完成的

Socket链接的建立过程

1.服务器监听

2.客户端发出请求

3.建立链接

4.通信

Socket特点

1.Socket基于TCP链接,数据传输有保障

2.Socket适用于建立长时间链接

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

服务器端ServerSocket

package com.enenya.serversocket;

import java.io.IOException;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class SimpleSocket {

public static void main(String[] str) {

try {

//创建一个ServerSocket,并且给定

侦听端口,

ServerSocket serverSocket = new

ServerSocket(30000);

while (true) {

//accept()方法会阻塞线程

Socket socket =

serverSocket.accept();

//

OutputStream outputStream

= socket.getOutputStream();

outputStream.write("你好

!Socket已接受到。".getBytes());

outputStream.close();

socket.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

服务器端编程

1. 新建一个线程类负责循环接收socket请求

package com.enenya.serversocket;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

//创建一个类继承Socket,并且是接受socket请求

public class ServerListener extends Thread {

public void run() {

try {

// 创建一个ServerSocket,并且给定

侦听端口,端口是1-65535

ServerSocket serverSocket = new

ServerSocket(30001);

// 因为客户端会有很多个请求,所以

需要创建多一个Socket实例

while (true) {

// accept()方法会阻塞线程

Socket socket =

serverSocket.accept();

new ChatSocket

(socket).start();

//serverSocket.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

2.新建一个线程类,负责写出信息

package com.enenya.serversocket;

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

//创建一个线程类,负责发送数据到客户端

public class ChatSocket extends Thread {

Socket socket;

public ChatSocket(Socket s) {

this.socket = s;

}

public void run() {

try {

OutputStream outputStream =

socket.getOutputStream();

outputStream.write("你好!Socket

已接受到。".getBytes());

outputStream.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

3.调用

package com.enenya.serversocket;

public class SimpleSocket {

public static void main(String[] str) {

new ServerListener().start();

}

}

完整的Socket网络编程

多用户输入,响应,并且同步的聊天室

1.新建一个类继承Thread,负责接收客户端发送的请求

package com.enenya.serversocket;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

//创建一个类继承Socket,并且是接受socket请求

public class ServerListener extends Thread {

public void run() {

try {

// 创建一个ServerSocket,并且给定

侦听端口,端口是1-65535

ServerSocket serverSocket = new

ServerSocket(30002);

// 因为客户端会有很多个请求,所以

需要创建多一个Socket实例

while (true) {

// accept()方法会阻塞线程

Socket socket =

serverSocket.accept();

ChatSocket chatSocket =

new ChatSocket(socket);

chatSocket.start();

ChatThreadManager.getChatManager().add(chatSocket);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

2.新建一个类继承Thread,负责发送消息

package com.enenya.serversocket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.UnsupportedEncodingException;

import java.net.Socket;

//创建一个线程类,负责发送数据到客户端

public class ChatSocket extends Thread {

Socket socket;

public ChatSocket(Socket s) {

this.socket = s;

}

public void out(String str) {

try {

OutputStream outputStream =

socket.getOutputStream();

outputStream.write(("你好!Socket

已接受到。是:" + str).getBytes());

outputStream.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void run() {

try {

BufferedReader bReader = new

BufferedReader(new InputStreamReader(

socket.getInputStream(), "UTF-8"));

String line = null;

while ((line = bReader.readLine

()) != null) {

ChatThreadManager.getChatManager().publish(this, line);

}

bReader.close();

} catch (UnsupportedEncodingException e)

{

// TODO Auto-generated catch

block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch

block

e.printStackTrace();

}

}

}

3.新建一个类,负责将输入消息加入队列,并且循环发送出去

package com.enenya.serversocket;

import java.util.Vector;

//负责将客户端发送过来的数据在线程间通信

public class ChatThreadManager {

// 表示该类不能被实例化

private ChatThreadManager() {

}

// 该类必须是单例模式

private static final ChatThreadManager CTM = new

ChatThreadManager();

public static ChatThreadManager getChatManager()

{

return CTM;

}

//线程安全的集合

Vector<ChatSocket> vector = new

Vector<ChatSocket>();

public void add(ChatSocket cs) {

vector.add(cs);

}

public void publish(ChatSocket cs, String out) {

for (int i = 0; i < vector.size(); i++) {

ChatSocket csChatSocket =

vector.get(i);

//如果当前socket对象不是要发送的

对象,就发送数据

if(!cs.equals(csChatSocket)){

csChatSocket.out(out);

}

}

}

}

4.服务器端启动

package com.enenya.serversocket;

public class SimpleSocket {

public static void main(String[] str) {

new ServerListener().start();

}

}

5.android客户端发送消息到服务器

package com.example.android_clientsocket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

import java.net.UnknownHostException;

import android.os.Bundle;

import android.app.Activity;

import android.widget.TextView;

public class MainActivity extends Activity {

private TextView textView;

@Override

protected void onCreate(Bundle

savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView) this.findViewById

(R.id.textview1);

new Thread(runnable).start();

}

private Runnable runnable = new Runnable() {

@Override

public void run() {

try {

Socket socket = new

Socket("172.28.232.1", 30002);

socket.setSoTimeout

(10000);

BufferedReader

brBufferedReader = new BufferedReader(

new

InputStreamReader(socket.getInputStream()));

String string =

brBufferedReader.readLine();

textView.setText(string);

brBufferedReader.close();

socket.close();

} catch (UnknownHostException e)

{

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

};

}

或者

在activity方法,点击某个按钮发送的消息

Socket socket = null;

BufferdWriter writer = null;

BufferdReader reader = null;

public void connect(){

try{

socket = new Socket("127.0.0.1",30002);

writer = new BufferdWriter(new

OutputStreamWriter(socket.getOutputStream()));

reader = new BufferedReader(new

InputStreamReader(socket.getInputStream()));

AsynTask<Void,String,Void> read = new

AsynTask<Void,String,Void>(){

@Override

protected void doInBackground(Void... arg0){

String line = "";

while((line = reader.readLine()) != null){

publishProgress(line);

}

}

};

read.execute();

}catch(UnknownHostException e){

Toast.make(this,"无法建立链接!",1).show();

}catch(IOException e){

Toast.make(this,"无法建立链接!",1).show();

}

}

public void send(){

try{

write.write(editText.getText().toString

());

editText.setText("");

}catch(Exception e){}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: