android002,简易PC-Android发送对话
?
PC作为服务器,手机Android作为客户端
button_sendContent = (Button) this.findViewById(R.id.button_sendContent);//发送按钮edit_content = (EditText) this.findViewById(R.id.edit_content);// 发送内容的编辑框
// 用户名个密码都正确后则跳转页面Intent intent = new Intent(FirstActivity.this,SecondActivity.class);FirstActivity.this.startActivity(intent);
<activity android:name=".SecondActivity"></activity>
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);//继续读客户机传来的流}// 如果输入的字节是byes = "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();}}}
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();// 副本,内容,停留时间以秒为单位}}};}
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;}}
<?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>
<?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>
?