Android客户端用socket与服务器通信,为什么能发不能收啊?

jiaojiao_huihui 2011-10-28 06:34:54
现在做一个类似即时通信的东西,服务器用java写,客户端在Android上面,两者用socket通信。
现在遇到的问题是:客户端可以发给服务器信息(服务器能够成功的收到),但是客户端却收不到服务器发来的数据,怎么回事啊?
...全文
288 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaojiao_huihui 2011-10-29
  • 打赏
  • 举报
回复
现在客户端出现的异常是:
10-29 01:43:11.854: ERROR/AndroidRuntime(407): java.lang.NullPointerException
10-29 01:43:11.854: ERROR/AndroidRuntime(407): at com.pnf.transfer.AndroidObjectClientActivity$1.run(AndroidObjectClientActivity.java:80)
10-29 01:43:11.894: WARN/ActivityManager(61): Force finishing activity com.pnf.transfer/.AndroidObjectClientActivity
jiaojiao_huihui 2011-10-29
  • 打赏
  • 举报
回复
以上是客户端的代码,下面是服务器的代码:

public class ObjectServer
{
private static List<Socket> sockets = new ArrayList<Socket>();
public ObjectServer() throws ClassNotFoundException
{
this.init();
}

//连接数据库
public void db() throws SQLException,ClassNotFoundException
{
String user = "root";
String pwd = "123";
String myjdbc = "jdbc:sqlserver://localhost:1433/SMS server";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection myConnection = DriverManager.getConnection(myjdbc, user, pwd);
System.out.println("数据库连接成功!");
Statement Myoperation = myConnection.createStatement();
ResultSet record = Myoperation.executeQuery("SELECT * FROM role");
while (record.next())
{
System.out.println(record.getInt("id") + "," + record.getString("name") + "," + record.getInt("score"));
}
try
{
if(record != null) record.close();
}catch(Exception e){e.printStackTrace();}
finally
{
try{
if (myConnection != null) myConnection.close();
}catch(Exception e){e.printStackTrace();}
}
}


//启动监听
public void init() throws ClassNotFoundException
{
ServerSocket serverSocket;
try
{
serverSocket = new ServerSocket(6666);
while(true)
{
Socket clientSocket = serverSocket.accept();
sockets.add(clientSocket);
Thread thread = new Thread(new ServerRunner(sockets,clientSocket));
thread.start();

}
}catch(IOException ioe){ ioe.printStackTrace();}
}

//把某个客户端(管理员)发送过来的数据转发给所有的客户端
class ServerRunner implements Runnable
{
private List<Socket> sockets;
private Socket currentSocket;
public ServerRunner(List<Socket> sockets,Socket currentSocket)
{
this.sockets = sockets;
this.currentSocket = currentSocket;
}
//@Override
public void run() {
String ip = currentSocket.getInetAddress().getHostAddress();
BufferedReader br = null ;
try{
br = new BufferedReader(new InputStreamReader(currentSocket.getInputStream()));
String str = null;
while((str = br.readLine()) != null)
{
System.out.println(ip + str);
for(Socket temp : sockets)
{
PrintWriter pw = new PrintWriter(new OutputStreamWriter(temp.getOutputStream()));
pw.println(str);
pw.flush();
}
}
}catch(IOException e){e.printStackTrace();}
}
}
public static void main(String[] args)
{
try{
new ObjectServer();
} catch (ClassNotFoundException e) {e.printStackTrace();}
}
}
jiaojiao_huihui 2011-10-29
  • 打赏
  • 举报
回复
public class AndroidObjectClientActivity extends Activity
{
private final String DEBUG_TAG = "Activity01";
private TextView mTextView = null;
private EditText mEditText = null;
private Button mButton = null;
Socket socket;
private Handler messageHandler;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton =(Button)findViewById(R.id.Button01);
mTextView = (TextView)findViewById(R.id.TextView01);
mEditText = (EditText)findViewById(R.id.EditText01);
class MessageHandler extends Handler
{
public MessageHandler(Looper looper)
{
super(looper);
}
@Override
public void handleMessage(Message msg)
{
try {
mTextView.setText((String)msg.obj);
} finally{}
}
}

new Thread() //开启新的线程,获得服务器发来的数据。
{
@Override
public void run()
{
BufferedReader br;
String msg1=null;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
msg1 = br.readLine();
} catch (IOException e) {e.printStackTrace();}
Message message1 = Message.obtain(); //创建一个Message对象,并把得到的天气信息赋值给Message对象
message1.obj = msg1;
messageHandler.sendMessage(message1);//通过Handler发布携带有天气情况的消息
}
}.start();

//建立socket连接
try{
socket = new Socket("**.**.**.**",6666);
}catch (UnknownHostException e1) {e1.printStackTrace();}
catch (IOException e1) {e1.printStackTrace();}
System.out.println("Connected to " + socket.getRemoteSocketAddress());

//接收来自服务器的消息
Looper looper = Looper.myLooper();
messageHandler = new MessageHandler(looper);

mButton.setOnClickListener(new OnClickListener() //点击发送按钮时,触发的操作。
{
public void onClick(View v)
{
String message = mEditText.getText().toString();
SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
String time =formater.format(new Date());
String sendStr ="(" +time+")"+":"+message;
try
{
//向服务器发送消息
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
out.println(sendStr);
out.flush();
mEditText.setText("");
out.close(); //关闭流
} catch (Exception e) { Log.e(DEBUG_TAG, e.toString()); }
}
});
}
}
carlos_xp 2011-10-29
  • 打赏
  • 举报
回复
介绍一个框架给你把! 蛮方便的 MINA框架
凌哥在奔跑 2011-10-29
  • 打赏
  • 举报
回复
用户数据报协议(UDP)由Java 软件的DatagramSocket 和DatagramPacket 类支持。

DatagramPacket

有两个构造函数:一个用来接收数据,另一个用来发送数据:
l DatagramPacket(byte [] recvBuf, int readLength)-用来建立一个字节数组以接收UDP 包。byte 数
组在传递给构造函数时是空的,而int 值用来设定要读取的字节数(不能比数组的大小还大)。
l DatagramPacket(byte [] sendBuf, int sendLength, InetAddress iaddr, int iport)-用来建立将要传输的
UDP 包。sendLength 不应该比sendBuf 字节数组的大小要大。

DatagramSocket

用来读写UDP 包。这个类有三个构造函数,允许你指定要绑定的端口号和internet
地址:
l DatagramSocket()-绑定本地主机的所有可用端口
l DatagramSocket(int port)-绑定本地主机的指定端口
l DatagramSocket(int port, InetAddress iaddr)-绑定指定地址的指定端口

楼主的端口号配置好了么
smilebombht 2011-10-28
  • 打赏
  • 举报
回复
贴点代码出来吧
多鱼的夏天 2011-10-28
  • 打赏
  • 举报
回复
用过socket,没有遇到过楼主的情况

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧