android socket对象传输
来源:互联网 发布:恶棍天使知乎 编辑:程序博客网 时间:2024/05/17 04:03
在学到这个之前,我只知道socket的字节流,字符传输,不知道对象也能传输。最近做一个项目,我们要实现不少数据的传输,而这些数据都是封装在类里面的,我们最好是能够把这个对象传过去,然后对方通过调用这个对象的方法来获得这个对象的相关数据。一下是实现代码。
在客户端和服务端都要实现的代码:
package com.infor;
import java.io.Serializable;
public class UserInfor implements Serializable{
private String name;
private String phoneNum;
private String password;
public UserInfor(){
}
public UserInfor(String name,String phoneNum,String password){
this.name=name;
this.password=password;
this.phoneNum=phoneNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在客户端的代码:
package com.client;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.infor.UserInfor;
public class AndroidSocketClientActivity extends Activity {
/** Called when the activity is first created. */
private EditText name, num;
private TextView reciver;
private Button sender;
private String userName, userNum;
private String userInfor;
private InputStream in;
private OutputStream out;
ObjectInputStream objectIn=null;
ObjectOutputStream objectOut=null;
UserInfor user;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
name = (EditText) findViewById(R.id.nameInput);
num = (EditText) findViewById(R.id.idNumInput);
reciver = (TextView) findViewById(R.id.reciver);
sender = (Button) findViewById(R.id.sender);
try {
InetAddress address = InetAddress.getByName("125.216.247.154");
Socket client = new Socket(address,10000, true);
Log.d("Client","connecting!!!!!!!!");
out = client.getOutputStream();
in = client.getInputStream();
Log.d("INANDROUT","in and out");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
objectOut=new ObjectOutputStream(out);
objectIn=new ObjectInputStream(in);
Log.d("OBJECTINANDROUT","object in and out");
} catch (Exception e) {
// TODO: handle exception
}
user=new UserInfor("liuxin","123456789","8888888");
Log.d("USER","user create");
sender.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
/*userInfor = name.getText().toString()
+ num.getText().toString();
sendMessage(userInfor);
reciver.setText(recieveMessage());*/
sendObject();
UserInfor u=(UserInfor)recieveObject();
Log.d("NAME",u.getName());
Log.d("PHONENUM",u.getPhoneNum());
Log.d("PASSWORD",u.getPassword());
}
});
}
void sendMessage(String message) {
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
writer.println(message);
writer.flush();
}
String recieveMessage() {
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String mm = null;
try {
mm = read.readLine();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return mm;
}
void sendObject(){
try {
if(user!=null&&objectOut!=null)
objectOut.writeObject(user);
else
Log.d("ObjectOut","ObjectOut is null");
objectOut.flush();
} catch (Exception e) {
// TODO: handle exception
}
}
Object recieveObject(){
Object ob=null;
try {
ob=objectIn.readObject();
} catch (Exception e) {
// TODO: handle exception
}
return ob;
}
}
在服务端的代码:
package com.server;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.infor.UserInfor;
public class AndroidSocketServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectInputStream objectIn=null;
ObjectOutputStream objectOut=null;
ServerSocket connection=null;
try {
connection=new ServerSocket(9999);
System.out.println("waiting for the message");
Socket dataSocket=connection.accept();
System.out.println("connected!!!!!!!!!!!!!");
OutputStream out=dataSocket.getOutputStream();
InputStream in=dataSocket.getInputStream();
PrintWriter writer=new PrintWriter(new OutputStreamWriter(out));
BufferedReader read=new BufferedReader(new InputStreamReader(in));
objectIn=new ObjectInputStream(in);
objectOut=new ObjectOutputStream(out);
UserInfor user=(UserInfor)objectIn.readObject();
if(user==null){
System.out.println("user is null");
return;
}
System.out.println("name: "+user.getName());
System.out.println("phoneNum: "+user.getPhoneNum());
System.out.println("password: "+user.getPassword());
UserInfor uu=new UserInfor("xieningtao","111111","33333333");
objectOut.writeObject(uu);
objectOut.flush();
/*String mr=read.readLine();
System.out.println("recieve message: "+mr);
writer.println("Hello!");
writer.flush();*/
} catch (Exception e) {
// TODO: handle exception
}
}
}
对以上代码有几个注意点:
1.客户端和服务端的ObjectInputStream和ObjectOutputStream是有顺序之分的,顺序反了也是会有问题的,一般是客户端先发送消息,所以在客户端的顺序为
ObjectOutputStream在ObjectInputStream的前面,而服务就刚好相反了。
2.要实现对象传递的类要实现Serializable接口,并且这个类在客户端和服务端都是在名字相同的包下面,比如说上面的类就是都在package com.infor里面。
3.记得改变android的网络权限。
- android socket对象传输
- socket传输类对象
- C# socket 传输对象
- socket对象的传输
- socket传输对象
- socket传输类对象
- 关于Socket传输对象
- 利用socket传输对象
- android socket传输
- android socket 传输示例
- Android:Socket连接传输
- C# socket传输自定义对象
- delphi java socket 对象传输
- C# socket传输自定义对象
- Socket传输序列化对象
- Java Socket实战-多线程通信 传输对象 传输压缩对象
- Android-Socket传输 GPRS网络
- Android-Socket基于UDP传输
- Oracle中的decode函数和sign函数
- IOS------Warning
- 无题诗一首
- 云部署会损害企业的法规遵从能力吗?
- VC 进制转换(二进制、十进制和十六进制)
- android socket对象传输
- Shell 笔记
- UE复制粘贴二进制文件
- java反射详解
- 微信收费持续发酵 或演变为运营商与腾讯的博弈
- ShellExecuteEx的用法 .
- yuv_to_jpeg
- 如果发生数据泄漏该如何处理?
- application/x-www-form-urlencoded、multipart/form-data、text/plain