选择端口的时候必须小心.每一个端口提供一种特定的服务.0~1023的端口为系统保留,所以选择端口时最好大于1023,防止冲突.
创建服务器步骤:
创建服务器步骤:
1. 指定端口实例化一个ServerSocket
2. 调用ServerSocket的accept()以在等待连接期间造成阻塞
3. 获取位于该底层socket的流以进行读写操作
4. 将数据封装成流
5. 对socket进行读写
6. 关闭打开的流
先关闭Reader在关闭Writer
服务器:import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @version 2012-7-26 下午04:04:18
**/
public class servce implements Runnable {
public void run() {
try {
// 创建ServerSocket
ServerSocket serverSocket = new ServerSocket(54321);
while(true) {
// 接受客户端请求
Socket client = serverSocket.accept();
System.out.println("accept");
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");
// 关闭流
in.close();
out.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
finally {
client.close();
System.out.println("close");
}
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
/**
* @param args
*/
public static void main(String[] args) {
Thread d = new Thread(new servce());
d.start();
}
}
使用socket实现客户端的步骤
1. 通过IP地址和端口实例化Socket,请求连接服务器
2. 获取Socket上的流以进行读写
3. 把流包装进BufferedReader/PrintWriter实例
4. 对Socket进行读写
5. 关闭打开的流使用iterSocket
客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
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 mainActivity extends Activity {
EditText et;
Button btn;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (EditText) findViewById(R.id.et1);
btn = (Button) findViewById(R.id.btn1);
tv = (TextView) findViewById(R.id.tv1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Socket socket = null;
String message = et.getText().toString() + "\r\n";
try {
// 创建socket
socket = new Socket("10.0.2.2", 54321);
// 向服务器发送消息
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) {
tv.setText(msg);
}
else {
tv.setText("数据错误");
}
// 关闭流
out.close();
br.close();
socket.close();
}
catch(Exception e) {
// TODO: handle exception
}
}
});
}
}
这是一个服务器和客户端单独通信