您的位置:首页 > 理论基础 > 计算机网络

Java知识整理(十)之SE.TCP通信(Server和Client源代码)

2015-09-19 10:14 363 查看
Socket(套接字):用于描述IP地址和端口,每个服务软件都打开了一个Socket,并绑定到一个端口上。Socket和ServerSocket(用于服务器)类位于java.net包

获取本地地址和端口号:int getLocalPort();String getHostAddress();InetAddress getLocalAddress();

获取网络输入输出流:

Socket相当于一个邮箱,pw.println();把信放到邮箱;br.readLine();从邮箱拿信;

使用Socket完毕后使用void close()方法关闭(会同时关闭输入输出流)

服务器端(Server):创建监听服务-->等待连接--->进行通讯--->关闭连接

public class Server{
private ServerSocket server;
private List<PrintWriter> allOut;
public Server(){
try{
allOut = new ArrayList<PrintWriter>();
server = new ServerSocket(8088);
}catch(Exception e){
e.printStackTrace();
}
}
private synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
private synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
private synchronized void sendMessageToAllClient(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}
public void start(){
try{
while(true){
System.out.println("等待客户端连接....");
Socket socket = server.accept();
ClientHandle clientHandle = new ClientHandle(socket);
Thread t = new Thread(clientHandle);
t.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Server server = new Server();
server.start();
}
private class ClientHandle implements Runnable{
private Socket socket;
private String host;
public ClientHandle(Socket socket){
this.socket=socket;
InetAddress address = socket.getInetAddress();
host = address.getHostAddress();
System.out.println(host+"上线了");
}
public void run(){
PrintWriter pw = null;
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);

InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println(host+"说:"+s);
}

}catch(Exception e){
e.printStackTrace();
}finally{
try{
removeOut(pw);
socket.close();
System.out.println(host+"下线了!");

}catch(IOException e){
e.printStackTrace();
}

}
}

}

}

客户端(Client):连接服务器-->进行通讯-->关闭连接

public class Client{
private Socket socket = new Socket();
public Client(){
try{
socket = new Socket("127.0.0.1",8088);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
try{
ServerMessage message = new ServerMessage();
Thread t = new Thread(message);
t.start();
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("服务端你好!");
Scanner sc = new Scanner(System.in);
while(true){
pw.println(sc.nextLine());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Client client = new Client();
client.start();
}
private class ServerMessage implements Runnable{
public void run(){
try{
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println("服务器说"+s);
}
}catch(IOException e){
e.printStackTrace();
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  server socket client