* Socket通信:套接字通信---认为TCP/UDP是属于它下面的
*
* 比较TCP/UDP?
* TCP与UDP的区别:
* TCP:流 UDP:包
* 1建立在连接的基础上 建立在非连接的基础上
* 2安全性更高 安全性低
* 3传输速度低 速度高
* 4适合传输数据量大的数据 数据量小的数据
*
* 客户端:(app/浏览器)
* 服务器端!=主机 [注:服务器只是主机上的一个应用,至于为什么有时候大家会说
* 这是一台服务器?因为那台主机上只有一个应用,是该应用专属的电脑]
* 端口号:同一台主机上每一个服务器拥有自己的端口号,取值范围[0,65535],
* 常用的端口:80,8080。
* 注意点:
* 1【要保证客户端和服务器端的端口号一致】
* 2要保证同一台主机上的不同服务器端口号不同
*
* UDP:
* 【注意点:在工作的时候,应该先将服务器端运行起来,处于一个监听状态,再运行客户端】
* 客户端:
* 1创建UDP通信的对象-socket对象:对应的类是DatagramSocket
* (用于UDP数据的发送与接收)
* 2数据的准备-封装包:DatagramPacket(数据包,包括相关的属性,数据)
* 3发送数据:通过send方法
//服务器端:接收数据
//1创建Socket对象,并绑定端口号
//2创建包对象,创建空数组,准备接收传来的数据
//3接收数据
//4关闭相关的对象
//接收数据,当程序运行起来的时候,它会一直运行,让程序处于监听状态
ds.receive(dp);
//将数据从包中取出
byte[] arr=dp.getData();
UDP不断发不断收---客户端
public class UDPClient1 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String data;
while((data=br.readLine())!=null)
{
byte[] b=data.getBytes();
DatagramPacket dp=new DatagramPacket(b,b.length,InetAddress.getLocalHost(),50001);
ds.send(dp);
if(data.trim().equals("over"))
break;
}
ds.close();
}
}
UDP不断发不断收---服务器端
package socket;
import java.io.IOException;
import java.net.*;
public class UDPServer1 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(50001);
while(true) {
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b,b.length);
ds.receive(dp);
byte[] arr=dp.getData();
String s=new String(arr).trim();
System.out.println(s);
if(s.equals("over"))
break;
}
ds.close();
}
}
package socket;
//用CTP实现客户端与服务器端之间的连续通信
import java.io.*;
import java.net.*;
public class TCPClient1 {
public static void main(String[] args) throws UnknownHostException, IOException {
InetAddress ina=InetAddress.getByName("10.0.154.144");
Socket socket=new Socket(ina,4212);
OutputStream os=socket.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStream is=socket.getInputStream();
while(true) {
String data=br.readLine();
byte[] b=data.getBytes();
os.write(b);
if(data.equals("over"))
break;
byte[] arr=new byte[1024];
int len=is.read(arr);
String data2=new String(arr,0,len);
System.out.println(data2);
if(data2.equals("over"))
break;
}
socket.close();
}
}
package socket;
//用CTP实现客户端与服务器端之间的连续通信
import java.io.*;
import java.net.*;
public class TCPServer1 {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(4212);
Socket socket=ss.accept();
InputStream input=socket.getInputStream();
OutputStream os=socket.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while(true) {
byte[] b=new byte[1024];
int len=input.read(b);
String str=new String(b,0,len);
System.out.println(str);
if(str.equals("over"))
break;
String data=br.readLine();
os.write(data.getBytes());
if(data.equals("over"))
break;
}
ss.close();
}
}
package socket;
import java.io.*;
import java.net.*;
/*
* 练习一:
* 实例:实现大小写转换的服务器
* 要求:实现不断发不断收
* ---客户端
*/
public class CaseClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket(InetAddress.getLocalHost(),6666);
OutputStream os=s.getOutputStream();
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
char c=(char)bf.read();
os.write(c);
if(c=='1')
break;
}
s.close();
}
}
package socket;
import java.io.*;
import java.net.*;
/*
* 练习一:
* 实例:实现大小写转换的服务器
* 要求:实现不断发不断收
* ---服务器端
*/
public class CaseServer {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();
InputStream is=s.getInputStream();
while(true)
{
Character c=(char)is.read();
if(c.isUpperCase(c))
System.out.println(c.toLowerCase(c));
if(c.isLowerCase(c))
System.out.println(c.toUpperCase(c));
if(c.equals('1'))
break;
}
s.close();
ss.close();
}
}