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的网络权限。

原创粉丝点击