关于android的socket练手小程序

最近一直在看安卓方面的相关知识,看到了网络编程方面,就弄了个小程序练练手,这个程序分为客户端和服务器端,主要实现的功能就是客户端通过socket连接到pc服务器,然后pc服务器输出收到的消息,并返回消息给安卓客户端,其中pc服务器是多线程操作,一直处于监听状态,收到一个连接请求后就产生一个子线程处理相应的操作。


下面就是具体点代码了:

android客户端:

package com.example.client;//安卓客户端程序

import java.io.*;
import java.net.Socket;

import android.os.*;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.*;

public class MainActivity extends Activity {

	private final String DEBUG_TAG="Activity01";
	private TextView mTextView=null;
	private EditText mEditText=null;
	private Button mButton=null;
	private Handler hd=new Handler()
	{
		public void handleMessage(Message message)
		{
			mTextView.setText((CharSequence) message.obj);
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mButton=(Button)findViewById(R.id.Button01);
		mTextView=(TextView)findViewById(R.id.TextView01);
		mEditText=(EditText)findViewById(R.id.EditText01);
		
		
		
		mButton.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				connect();
			}
		});
	}

	void connect()
	{
		new Thread()
		{
			public void run()
			{
				Socket socket=null;
				String message=mEditText.getText().toString()+"\r\n";
				//创建socket
				try{
					socket =new Socket("192.168.1.123",12345);
					//向服务器发送消息
					PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
					out.println(message);
					//接收来自服务器的消息
					BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
					String msg=br.readLine();
					if(msg!=null)
					{
						Message messag=new Message();
						messag.obj=msg;
						hd.sendMessage(messag);
					}
					else
					{
						Message messag=new Message();
						messag.obj="数据错误";
						hd.sendMessage(messag);
					}
					//关闭流
					out.close();
					br.close();
					//关闭socket
					socket.close();
				}
				catch(Exception e)
				{
					Log.e(DEBUG_TAG, e.toString());
				}
			}
		}.start();
		
	}

}


xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="vertical" >

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="收到的消息显示"
        android:textSize="8pt" />
    
    <EditText
        android:id="@+id/EditText01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="请输入发送给服务器的消息"
        android:textSize="8pt" />

        />

    <Button
        android:id="@+id/Button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送"
        android:textSize="8pt" />

</LinearLayout>

下面是服务器端程序:

package org.zq.server;//服务器端程序

import java.io.*;
import java.net.*;



public class Server implements Runnable{

	public void run()
	{
		try
		{
			//创建serversocket
			ServerSocket serverSocket =new ServerSocket(12345);
			while(true)
			{
				//接收客户端请求
				System.out.println("等待连接");
				Socket client=serverSocket.accept();
				System.out.println("收到连接");
				try
				{
					//接收客户端消息
					BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
					String str=in.readLine();
					System.out.println("read:"+str);
					//向客户端发送消息
					PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
					out.println("Server message");
					//关闭流
					out.close();
					in.close();
				}
				catch(Exception e)
				{
					System.out.println(e.getMessage());
					e.printStackTrace();
				}
				finally
				{
					//关闭
					client.close();
					System.out.println("close");
				}
			}
		}catch(Exception e)
		{
			System.out.println(e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		Thread task=new Thread(new Server());
		task.start();

	}

}

其中存在一些问题后来解决了,一开始安卓客户端连接服务器始终连接不上,没反应,后来发现原来没给程序权限问题导致,如果要使安卓程序能够连上网的话必须在AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>,然后就能连接服务器了。

还有是一开始将socket操作写在了UI线程中,也导致socket操作始终无法顺利进行,客户端程序一直卡在了socket那,后来查阅资料后将socket操作写在了子线程中而不是UI线程中,于是就连上了,UI线程一般只是负责界面的更改吧。

因为这个程序用来练手,所以比较简单,界面也比较简陋,具体改进在以后的学习中不断进行吧。把具体实现过程写下来既给大家一些参考,也给自己留着看看吧。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值