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

8月2日----TCP Socket 编程

2015-08-04 21:15 585 查看

TCP编程基础

TCP是基于Socket类编写的通信程序。

InetAddress类

InetAddress类是与IP地址相关的类,利用该类可以获取IP地址,主机地址等信息,常用的方法如下:

getAddress()

返回此 InetAddress 对象的原始 IP 地址。

getByName(String host)

在给定主机名的情况下确定主机的 IP 地址。

getAllByName(String host)

在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

getHostName()

获取此 IP 地址的主机名。

getLocalHost()

返回本地主机。

实例:

package com.lingzhuo.socket;

import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Test {
public static void main(String[] args) {
try {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address.getHostName());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


TCP通信

通过例子来说明

下面的代码实现的是客户端与服务器的互相通信,从客户端开始,一人一句

//服务器端代码
package com.lingzhuo.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(12345);
System.out.println("服务器启动");
Socket socket  = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream());

while(true){
String s1 = in.readLine();
System.out.println("客户端说"+s1);
String s = br.readLine();
pw.println(s);
pw.flush();

}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
//客户端代码
package com.lingzhuo.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class MyClient {
public static void main(String[] args) {
try {
Socket socket =new Socket("localhost",12345);
System.out.println("客户端启动");
//          OutputStreamWriter osw;
//          osw = new OutputStreamWriter(socket.getOutputStream());
//          BufferedWriter out = new BufferedWriter(osw);
//上面的三句相当于下面的一句,下面是一层层封装起来,写成一句
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
while(true){
String s = br1.readLine();
out.println(s);
out.flush();
String s1 = br.readLine();
System.out.println("服务器说"+s1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


结果截图





用多线程写TCP通信代码,可以实现服务器与客户端的任意通信,不局限于一次只能发一句

//读操作的线程
package com.lingzhuo.socketThread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.net.Socket;

public class ClientThread implements Runnable {
Socket socket;
String name;

public ClientThread(String name,Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
this.name = name;

}

@Override
public void run() {
// TODO Auto-generated method stub

BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String s1 = br.readLine();
System.out.println(name +"说:  "+ s1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//写操作的线程
package com.lingzhuo.socketThread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread implements Runnable {

Socket socket;

public ServerThread(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}

@Override
public void run() {

try {
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
while (true) {
String s = br1.readLine();
out.println(s);
out.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//客户端
package com.lingzhuo.socketThread;

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

public class TCPClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",12345);
ClientThread client = new ClientThread("Server",socket);
ServerThread server = new ServerThread(socket);
Thread t1 = new Thread(client);
Thread t2 = new Thread(server);
t1.start();
t2.start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//服务器
package com.lingzhuo.socketThread;

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

public class TCPServer {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(12345);
Socket socket  = server.accept();
ClientThread client = new ClientThread("Client",socket);
ServerThread serve = new ServerThread(socket);
Thread t1 = new Thread(client);
Thread t2 = new Thread(serve);
t1.start();
t2.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


实验结果



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