`

android002,简易PC-Android发送对话

 
阅读更多

 

一、思路:

1、首先需要一个服务器,一个客户端:

PC作为服务器,手机Android作为客户端

2、服务器:接收流后将流输出并加上标识后再以流输出发送给客户端

3、客户端:将编辑框输入的字符串以字节流输出给服务器,再接收服务器的流并显示到另一个编辑框内!

4、大体思路如此!其他细节:

       A:虽然setText()中括号里是int型数据,但任然可以在里面写字符串,因为EditText继承了TextView

       B:流结束要有标识符

       C:组件通过查找对应的ID并转型:

 

button_sendContent = (Button) this.findViewById(R.id.button_sendContent);//发送按钮
		edit_content = (EditText) this.findViewById(R.id.edit_content);// 发送内容的编辑框

          D:页面的跳转:

 

// 用户名个密码都正确后则跳转页面
				Intent intent = new Intent(FirstActivity.this,
						SecondActivity.class);
				FirstActivity.this.startActivity(intent);

           E:之后添加的Activity需要注册:

 

 <activity android:name=".SecondActivity"></activity>

          F:使用互联网,需要添加互联网权限:


 

 二、源代码及其注释:

1、服务器PC端:

 

package androidke.flycatdeng.lesson002;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器PC
 * @author flycatdeng
 * 
 */
public class ChatServer {

	// 声明
	Socket client;// 客户机对象
	OutputStream ous;// 输出流对象
	InputStream ins;// 输入流对象

	/**
	 * 启动服务器方法
	 */
	public void processChat(int port) throws Exception {
		ServerSocket server = new ServerSocket(port);// 首先创建一个服务器并指定窗口
		System.out.println("服务器创建成功,端口:" + port);//打印端口
		// 服务器处于阻塞等待状态,但是如果这样就像手机接电话一样 只能一个客户,所以我们要等待循环
		while (true) {
			client = server.accept();
			System.out.println("有客户进来哒,IP是:" + client.getRemoteSocketAddress());// 打印客户的IP地址
			dealClient(client);// 处理客户
		}
	}

	// 处理用户的方法
	public void dealClient(Socket client) throws Exception {
		// 从连结对象上得到输入输出流对象
		ous = client.getOutputStream();// 这个输出的数据将会给连结对象(客户)
		ins = client.getInputStream();// 这个是客户机上输入的流
		String s = "Hello,welcome to use CC\r\n";// 欢迎词
		sendMSg(s);// 发送欢迎语
		String inputs = readString(ins);//读取从客户机传来的流并转换为字符串
		while (!inputs.equals("bye")) {//如果读取到的不是bye则继续读
			System.out.println("读到的客户机说:" + inputs);
			String s2 = "client send:" + inputs + "\r\n";
			System.out.println("正准备给客户机发送:" + s2);
			sendMSg(s2);//将流发送给客户机
			inputs = readString(ins);//继续读客户机传来的流
		}
		// 如果输入的字节是bye
		s = "welcome to here next time \r\n";
		sendMSg(s);
		client.close();//关闭与客户的连结
	}

	/**
	 * 将要输出的字符串封装在一个方法里,以便调用
	 * @param s :得到的一个从客户机输入的字符串
	 */
	public void sendMSg(String s) throws IOException {
		System.out.println("发送了" + s);
		ous.write(s.getBytes());//将字符串以字节数组读出
		ous.flush();//强制完全输出
	}
	
	/**
	 * 读取输入流(一个一个字节的读),并返回输入的字符串
	 * @param ins:输入流
	 * @return:返回输入的字符串
	 * @throws Exception
	 */
	public String readString(InputStream ins) throws Exception {
		System.out.println("开始读流了!!");
		// 创建一个字符串缓冲区
		StringBuffer stb = new StringBuffer();
		int in = ins.read();
		System.out.println("这里执行了吗?");
		char c;
		while (in != 13) {// 当不是回车键的时候
			c = (char) in;// 强制将int型in转换为char类型
			stb.append(c);// 将字符一个一个的附加
			in = ins.read();// 再读
		}
		String inputS = stb.toString().trim();// 将stb转换成字符串并去掉末尾的空格
		System.out.println("读完流了!!");
		return inputS;
	}

	// 主函数
	public static void main(String[] args) {
		ChatServer cs = new ChatServer();
		try {
			cs.processChat(8090);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 2、客户端Android:

第一个Activity:FirstActivity:

 

package androidke.flycatdeng.lesson002;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class FirstActivity extends Activity {
	// 声明
	Button button_send;
	EditText edit_username, edit_password;
	Socket client;
	static InputStream ins;// 静态输入流对象
	static OutputStream ous;// 静态输出流对象

	// 这个Activity重写的onCreate方法相当于主函数
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		try {
			client = new Socket("220.168.117.31", 8090);//在显示页面之前创建客户对象
			System.out.println("已经创建客户");
			ous = client.getOutputStream();
			ins = client.getInputStream();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		setContentView(R.layout.main);// 主页面为main.xml
		// 可视后取得各个组件的id并强制转换为相应的组件类型
		button_send = (Button) this.findViewById(R.id.button_send);// 提交按钮
		edit_username = (EditText) this.findViewById(R.id.edit_username);// 用户名编辑框
		edit_password = (EditText) this.findViewById(R.id.edit_password);// 密码编辑框
		// 给按钮添加(设置)监听器
		button_send.setOnClickListener(ocl);
	}

	// 内部匿名类
	OnClickListener ocl = new OnClickListener() {// 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener;
		// 重写方法
		public void onClick(View v) {
			// 将编辑框的内容得到并转换为字符串
			String username = edit_username.getText().toString();
			String password = edit_password.getText().toString();
			if ("d".equals(username) && "1".equals(password)) {
				// 用户名个密码都正确后则跳转页面
				Intent intent = new Intent(FirstActivity.this,
						SecondActivity.class);
				FirstActivity.this.startActivity(intent);
			} else {
				// 如果登录错误则提示
				Toast.makeText(FirstActivity.this, "用户名不存在活密码错误!", 3).show();// 副本,内容,停留时间以秒为单位
			}
		}
	};
}

 第二个Activity:SecondActivity:

 

package androidke.flycatdeng.lesson002;

import java.io.InputStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SecondActivity extends Activity{
	// 声明
	Button button_sendContent;
	EditText edit_content;
	TextView TextView_show;
	String content;
	Socket client;
	
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);// 转到第二个页面second.xml
		// //跳转页面后取得其服务器ip和端口
		// serverIP=this.getIntent().getStringExtra("localhost");
		// port=this.getIntent().getIntExtra("8090", 8090);
		//创建客户端 对象
		System.out.println("执行到这里!!!!!!!!!!");
		try {
			processChat();//显示服务器发来的消息的方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		button_sendContent = (Button) this.findViewById(R.id.button_sendContent);//发送按钮
		edit_content = (EditText) this.findViewById(R.id.edit_content);// 发送内容的编辑框
		button_sendContent.setOnClickListener(ocl);
	}
	
	// 内部匿名类
	OnClickListener ocl = new OnClickListener() {// 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener;
		// 重写方法
		public void onClick(View v) {
			content=edit_content.getText().toString();
			System.out.println("客户端文本框输入的内容是:"+content);
			try {
				sendMSg(content+"\r\n");//将得到的编辑框内的内容以流输出
				edit_content.setText("");//将其内容设置为空
				content=edit_content.getText().toString();//再显示
				processChat();//显示服务器发来的消息的方法,鼠标每次点击按钮都调用这个显示的方法
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};
	
	//创建客户的方法
	public void processChat() throws Exception{
		System.out.println("执行到这里了!!!!!!!!!!!!!");
		String inputs=readString(FirstActivity.ins);//得到了服务器传来的字符串
		System.out.println(inputs);//打印是否得到了服务器传来的字符串
			TextView_show = (TextView) this.findViewById(R.id.TextView_show);// 显示内容的编辑框
			TextView_show.setText(inputs);//设置上面的文本为得到的流的转换的字符串
			TextView_show.getText().toString();//将其转换为字符串,如果没有这一句,文本将不会显示
	}
	
	/**
	 * 将要输出的字符串封装在一个方法里,以便调用
	 * @param s :得到的一个从客户机输入的字符串
	 */
	public void sendMSg(String s) throws Exception{
		System.out.println("在发送吗?");
		FirstActivity.ous.write(s.getBytes());
		FirstActivity.ous.flush();
		System.out.println("向服务器发送流完成");
	}
	/**
	 * 读取输入流(一个一个字节的读),并返回输入的字符串
	 * @param ins:输入流
	 * @return:返回输入的字符串
	 * @throws Exception
	 */
	public String readString(InputStream ins) throws Exception {
		//创建一个字符串缓冲区
		StringBuffer stb=new StringBuffer();
		int in=ins.read();
		char c;
		while (in != 13) {// 当不是回车键的时候
			c = (char) in;// 强制将int型in转换为char类型
			stb.append(c);// 将字符一个一个的附加
			in = ins.read();// 再读
		}
		String inputS=stb.toString().trim();//将stb转换成字符串并去掉末尾的空格
		return inputS;
	}
}

 3、第一个页面:main.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <!-- 这下面的前两句是每个组件必要的属性 -->
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="欢迎使用手机CC"
    />
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="用户名:"
    />
<EditText
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/edit_username"
/>
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="密码:"
    />
<EditText
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/edit_password"
/>
<Button
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="提交"
    android:id="@+id/button_send"
/>
</LinearLayout>

 4、第二个页面:second.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="登录成功"
    />
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
     android:id="@+id/TextView_show"
    />
 <EditText
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:singleLine="false"
    android:id="@+id/edit_content"
 />
 <Button
 android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="发送"
   android:id="@+id/button_sendContent"
 />
</LinearLayout>

 5、效果:


 

  • 大小: 12.6 KB
  • 大小: 16.3 KB
0
0
分享到:
评论

相关推荐

    android-support-v4-v7-v13-v14-v17(官方最新完整版)

    android-support-v4-v7-v13-v14-v17(官方最新完整版),官方最新版的,压缩包内包含android-support-v4、android-support-v7-appcompat,android-support-v7-cardview,android-support-v7-gridlayout,android-support-...

    Android音频混合 -- K歌合成

    在Android平台上,音频混合是一个非常有趣的领域,尤其对于开发K歌应用或者音乐制作类应用来说,音频混合功能是必不可少的。本项目名为“Android音频混合 -- K歌合成”,旨在实现类似唱吧K歌合成和Tom猫录音的效果,...

    android-x86-4.0(原版安装包)

    android-x86-4.0-RC2-eeepc.iso 用于安装测试机中使用.

    android-sdk-4.2.2 android-sdk-4.2.2-platforms

    标题中的"android-sdk-4.2.2 android-sdk-4.2.2-platforms"指的是Android SDK的一个特定版本,即Android 4.2.2(API级别17),该版本的SDK平台组件。这个版本是Android操作系统的 Jelly Bean 版本的一部分,发布于...

    Android项目实战--手机卫士10--GPS定位与发送短信指令

    Android项目实战--手机卫士10--GPS定位与发送短信指令

    xUltimate-d9pc-x86.rar

    总的来说,"xUltimate-d9pc-x86.rar"提供的工具可以帮助开发者和设计师更有效地处理点9图片,去除黑边,优化UI设计,从而提升Android应用的质量和用户体验。掌握这种工具的使用方法,对于从事Android开发的专业人士...

    ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar

    ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 要是需要最新的,下载地址: http://code.google.com/p/ksoap2-android/

    android-4.3-sdk android-sdk-4.3-platforms

    当描述中提到"将android-18解压到Android\android-sdk\platforms下"时,这意味着你需要下载并安装Android 4.3(API级别18)的SDK平台,以便在开发环境中使用。 1. **API级别18**:每个Android版本都有一个对应的API...

    Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明

    Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明

    android-sdk-windows-1.5_r3.zip-tools

    标题中的“android-sdk-windows-1.5_r3.zip-tools”表明这是一个针对Windows平台的Android SDK的早期版本,具体为1.5_r3。这个压缩包包含的是SDK中的“tools”目录,里面通常装有用于Android应用开发和设备管理的...

    android v4-v7-v13-v17jar包最新最全

    android-support-v4.jar android-support-v7-appcompat.jar v7-cardview.jar v7-gridlayout.jar v7-mediarouter.jar v7-palette.jar v7-recyclerview.jar android-support-v13.jar android-support-v17-...

    Android实现用Android手机控制PC端的关机和重启的功能

    我的Android进阶之旅------&gt;Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端 (地址:http://blog.csdn.net/ouyang_peng/article/details/47004617) 我的Android进阶之旅------&gt;Android实现用...

    android 3.1 android sdk 3.1 android-sdk_r11-windows

    android sdk 3.1 android-sdk_r11-windows 只是个tool,sdk还要自己下载 手机开发平台 Google Android SDK 3.1 R11 Android eclipse插件安装: https://dl-ssl.google.com/Android/eclipse/ Android netBean插件安装:...

    android-4.1SDK android-sdk_r20-windows.zip

    http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-windows.zip(推荐) http://s1.eoeandroid.com/sdk/4.1/installer_r20-windows.exe Mac版: http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-macosx.zip ...

    [14本经典Android开发教程]-5-linux Android基础知识总结

    [14本经典Android开发教程]-5-linux Android基础知识总结 ------------------------------------------------------- linux ,Android基础知识总结 1. Android编译系统分析 2. 文件系统分析 3. 制作交叉工具链 4. ...

    android-async-http-1.4.8.jar

    强大的网络请求库,主要特征如下: 处理异步Http请求,并通过匿名内部类处理回调结果 Http请求均位于非UI线程,...通过线程池处理并发请求 处理文件上传、下载 响应结果自动打包JSON格式 自动处理连接断开时请求重连

    Android简易版聊天室

    在本文中,我们将深入探讨如何构建一个简单的Android聊天室应用,以及它与PC服务器端和客户端的交互。这个"Android简易版聊天室"项目旨在提供一个基础架构,用于理解多平台间实时通信的工作原理。 首先,我们要理解...

    我的Android进阶之旅------>Android疯狂连连看游戏的实现

    我的Android进阶之旅------&gt;Android疯狂连连看游戏的实现 可以参考博客:http://blog.csdn.net/ouyang_peng/article/details/14115627

    Android自定义锁屏实现----仿正点闹钟滑屏解锁

    在Android开发中,自定义锁屏界面是一种常见的需求,它能提供独特的用户体验并增强应用程序的交互性。"Android自定义锁屏实现----仿正点闹钟滑屏解锁"这一主题,旨在教你如何创建一个类似“正点闹钟”应用中的滑动...

Global site tag (gtag.js) - Google Analytics