这两天被这个问题搞得很头疼,本来以为很简单的一个事,结果花了不少时间。
首先是服务器端,很简单的一个等待连接:
1 package com.mingrisoft; 2 3 import java.awt.BorderLayout; 4 import java.net.*; 5 import javax.swing.JFrame; 6 import javax.swing.JScrollPane; 7 import javax.swing.JTextArea; 8 9 public class ServerSocketFrame extends JFrame { 10 private JTextArea ta_info; 11 private ServerSocket server; // 声明ServerSocket对象 12 private Socket socket; // 声明Socket对象socket 13 14 public void getServer() { 15 try { 16 server = new ServerSocket(1992); // 实例化Socket对象 17 ta_info.append("服务器套接字已经创建成功\n"); // 输出信息 18 while (true) { // 如果套接字是连接状态 19 ta_info.append("等待客户机的连接......\n"); // 输出信息 20 socket = server.accept(); // 实例化Socket对象 21 ta_info.append("连接成功......\n"); 22 } 23 } catch (Exception e) { 24 e.printStackTrace(); // 输出异常信息 25 } 26 } 27 28 public static void main(String[] args) { // 主方法 29 ServerSocketFrame frame = new ServerSocketFrame(); // 创建本类对象 30 frame.setVisible(true); 31 frame.getServer(); // 调用方法 32 } 33 34 public ServerSocketFrame() { 35 super(); 36 setTitle("建立服务器套接字"); 37 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 38 setBounds(100, 100, 260, 167); 39 40 final JScrollPane scrollPane = new JScrollPane(); 41 getContentPane().add(scrollPane, BorderLayout.CENTER); 42 43 ta_info = new JTextArea(); 44 scrollPane.setViewportView(ta_info); 45 } 46 }
android客户端:
1 package com.wxp.And255; 2 3 import java.io.IOException; 4 import java.net.InetSocketAddress; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 import java.net.UnknownHostException; 8 9 import android.os.Bundle; 10 import android.os.Handler; 11 import android.os.StrictMode; 12 import android.annotation.SuppressLint; 13 import android.annotation.TargetApi; 14 import android.app.Activity; 15 import android.view.Menu; 16 import android.view.MenuItem; 17 import android.view.View; 18 import android.view.View.OnClickListener; 19 import android.widget.Button; 20 import android.widget.Toast; 21 import android.support.v4.app.NavUtils; 22 23 @TargetApi(9) 24 @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi" }) 25 public class MainActivity extends Activity { 26 27 28 private Button con; 29 Socket socket; 30 InetSocketAddress isa=null; 31 @TargetApi(9) 32 @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi" }) 33 public void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 37 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 38 .detectDiskReads().detectDiskWrites().detectNetwork() 39 .penaltyLog().build()); 40 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 41 .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() 42 .build()); 43 44 con=(Button) findViewById(R.id.button1); 45 con.setOnClickListener(new OnClickListener() { 46 47 public void onClick(View v) { 48 49 Handler handler=new Handler(); 50 handler.post(socketThread); 51 52 } 53 }); 54 55 } 56 57 Runnable socketThread = new Runnable() { 58 public void run() { 59 60 try { 61 62 socket=new Socket("192.168.1.100",1992); 63 64 Toast.makeText(MainActivity.this, "ok", 3000).show(); 65 } catch (Exception e) { 66 // TODO Auto-generated catch block 67 e.printStackTrace(); 68 } 69 } 70 }; 71 72 90 @Override 91 public boolean onCreateOptionsMenu(Menu menu) { 92 getMenuInflater().inflate(R.menu.activity_main, menu); 93 return true; 94 } 95 96 97 }
注意这部分:
setContentView(R.layout.activity_main);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
.build());
我也搞不懂为什么,网上说socket连接要在另一个线程里面进行,我试了也没用,后来加了这段就有用了。
布局文件:
<RelativeLayout 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" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView1"
android:layout_alignLeft="@+id/textView1"
android:text="con" />
</RelativeLayout>
暂时就这么多,详细使用下回分解。