Android学习笔记(十三)——socket的使用

来源:互联网 发布:阿里云 发票类别 编辑:程序博客网 时间:2024/04/30 03:35

一下内容和代码摘自mars老师的视频:

1.        使用基于TCP协议的Socket
一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如192.168.1.1),也可以是主机名(example.com)。
在Java当中InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。下面为大家介绍一下基于TCP协议操作Socket的API:
ServerSocket:这个类是实现了一个服务器端的Socket,利用这个类可以监听来自网络的请求。

a)        创建ServerSocket的方法:
ServerSocket(Int localPort)
ServerSocket(int localport,int queueLimit)
ServerSocket(int localport,int queueLimit,InetAddress localAddr)
创建一个ServerSocket必须指定一个端口,以便客户端能够向该端口号发送连接请求。端口的有效范围是0-65535

b)        ServerSocket操作
Socket accept()
void close
accept()方法为下一个传入的连接请求创建Socket实例,并将已成功连接的Socket实例返回给服务器套接字,如果没有连接请求,accept()方法将阻塞等待;
close方法用于关闭套接字

Socket:

a)        创建Socket的方法:
Socket(InetAddress remoteAddress,int remotePort)

利用Socket的构造函数,可以创建一个TCP套接字后,先连接到指定的远程地址和端口号。

b)        操作Socket的方法
InputStream getInputStream()
OutputStream getOutputStream()
void close()

使用基于UDP的Socket

a)        创建DatagramPacket
DatagramSocket(byte [] data,int offset,int length,InetAddress remoteAddr,intremotePort)
该构造函数创建一个数据报文对象,数据包含在第一个参数当中

b)        创建DatagramSocket创建
DatagramSocket(int localPort)
以上构造函数将创建一个UDP套接字;

c)        DatagramSocket:发送和接受
void send(DatagramPacket packet)
void receive(DatagramPacket packet)
send()方法用来发送DatagramPacket实例。一旦创建连接,数据报将发送到该套接字所连接的地址;
receive()方法将阻塞等待,知道接收到数据报文,并将报文中的数据复制到指定的DatagramPacket实例中

下面是一个简单的例子,分别实现了基于TCP的socket和基于UDP的socket

1、基于TCP的socket

客户端程序:package mars;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.net.Socket;public class TCPClient {public static void main(String[] args) {try {//创建一个Socket对象,指定服务器端的IP地址和端口号Socket socket = new Socket("192.168.1.104",4567);//使用InputStream读取硬盘上的文件InputStream inputStream = new FileInputStream("f://file/words.txt");//从Socket当中得到OutputStreamOutputStream outputStream = socket.getOutputStream();byte buffer [] = new byte[4*1024];int temp = 0 ;//将InputStream当中的数据取出,并写入到OutputStream当中while((temp = inputStream.read(buffer)) != -1){outputStream.write(buffer, 0, temp);}outputStream.flush();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

服务端程序:package mars.socket;import java.net.DatagramPacket;import java.net.DatagramSocket;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SocketActivity extends Activity {    /** Called when the activity is first created. */private Button startButton = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        startButton = (Button)findViewById(R.id.startListener);        startButton.setOnClickListener(new StartSocketListener());    }        class StartSocketListener implements OnClickListener{@Overridepublic void onClick(View v) {new ServerThread().start();}        }        class ServerThread extends Thread{    public void run(){    //声明一个ServerSocket对象    ServerSocket serverSocket = null;    try {    //创建一个ServerSocket对象,并让这个Socket在4567端口监听serverSocket = new ServerSocket(4567);//调用ServerSocket的accept()方法,接受客户端所发送的请求Socket socket = serverSocket.accept();//从Socket当中得到InputStream对象InputStream inputStream = socket.getInputStream();byte buffer [] = new byte[1024*4];int temp = 0;//从InputStream当中读取客户端所发送的数据while((temp = inputStream.read(buffer)) != -1){System.out.println(new String(buffer,0,temp));}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}    }    }}

下面是基于UDP的socket:

客户端的程序:package mars;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPClient {public static void main(String[] args) {try {//首先创建一个DatagramSocket对象DatagramSocket socket = new DatagramSocket(4567);//创建一个InetAddreeInetAddress serverAddress = InetAddress.getByName("192.168.1.104");String str = "hello";byte data [] = str.getBytes();//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号DatagramPacket packet = new DatagramPacket(data,data.length,serverAddress,4567);//调用socket对象的send方法,发送数据socket.send(packet);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

服务器端程序:package mars.socket;import java.net.DatagramPacket;import java.net.DatagramSocket;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class SocketActivity extends Activity {    /** Called when the activity is first created. */private Button startButton = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        startButton = (Button)findViewById(R.id.startListener);        startButton.setOnClickListener(new StartSocketListener());    }        class StartSocketListener implements OnClickListener{@Overridepublic void onClick(View v) {new ServerThread().start();}        }        class ServerThread extends Thread{    public void run(){    try {    //创建一个DatagramSocket对象,并指定监听的端口号DatagramSocket socket = new DatagramSocket(4567);byte data [] = new byte[1024];//创建一个空的DatagramPacket对象DatagramPacket packet = new DatagramPacket(data,data.length);//使用receive方法接收客户端所发送的数据socket.receive(packet);String result = new String(packet.getData(),packet.getOffset(),packet.getLength());System.out.println("result--->" + result);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}    }    }}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 烫伤泡破了红肿怎么办 烧伤第二天水泡破了怎么办? 烧伤后换药特别疼怎么办 盐酸溅到皮肤上怎么办 磷性磷酸酶高440怎么办 浓硫酸沾到皮肤上怎么办 浓硫酸溅到皮肤上怎么办 浓硫酸滴到皮肤上怎么办 浓硫酸洒在皮肤上怎么办 浓硫酸溅到眼睛里怎么办 盐酸弄到眼睛了怎么办 稀硫酸进眼睛里怎么办 草酸弄到皮肤上怎么办 大理石被盐酸烧发白怎么办 香薰蜡烛化了怎么办 吸入了大量燃烧纸气体怎么办 狗链条上锈了怎么办 思维迟钝反应慢嘴笨怎么办 小孩思维慢反应迟钝怎么办 苹果4g网络慢怎么办 医院没有号了怎么办啊 fgo宝具动画卡顿怎么办 死刑犯在执行前死亡怎么办 汕头交警 违章扣分怎么办办理 幼儿园家长不保险应该怎么办 csgo掉白银坑了怎么办 错过教资认定现场确认怎么办 乡村建设导致民房开裂怎么办 项目部公章丢了怎么办 手机掉了没有卡怎么办 苹果系统软件删了还是出现怎么办 钉钉检测到作弊怎么办 电脑麦说话声音小怎么办 穿越火线麦克风有杂音怎么办 手闲不住就抠东西怎么办 大便堵在肛门口怎么办 在外地流量不够用怎么办 电脑键盘数字键没反应怎么办 音响音量键坏了怎么办 摩托罗拉移动电话通话没声音怎么办 摩托罗拉对讲机充电座坏了怎么办