MyTCP/Server.java

91 lines
2.6 KiB
Java
Raw Permalink Normal View History

2018-06-10 21:06:36 +08:00
package TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import java.awt.*;
import TCP.MySegment;
public class Server {
public static int port=8888;
public static void send(String content,OutputStreamWriter osw) throws IOException, InterruptedException
{
Random random=new Random();
if(random.nextInt(100)>30)
{
osw.write(content+"\n");
osw.flush();
Thread.sleep(200);
}
else
{
content="00"+content.substring(2);
osw.write(content+"\n");
osw.flush();
Thread.sleep(200);
}
}
public static void main(String []args) throws IOException, InterruptedException
{
int ackno=0;
int window=1;
StringBuilder content =new StringBuilder("0");
boolean ack=false;
int acked=-1;
for(int i=1;i<50;i++) content.append((char)('0'+i%10));
Frame frame =new Frame("Server");
frame.setLayout(new GridLayout(2,1));
frame.setTitle("Server");
frame.setSize(500, 100);
frame.setLocation(800, 200);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
Label toSend=new Label("toSend: "+content.toString());
frame.add(toSend);
ServerSocket server=new ServerSocket(port);
Socket socket=server.accept();
OutputStreamWriter osw=new OutputStreamWriter(socket.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
String[] segkey=null;
for(int i=0;i<50;i++)
{
if(i>acked&&i<=window+acked)
{
MySegment seg=new MySegment(socket.getLocalPort(),socket.getPort(),i,ackno,ack,window,(byte)(i%10));
send(seg.toSend,osw);
System.out.println("sent segment "+seg.SequenceNumber);
segkey=br.readLine().split("--");
MySegment segACK=new MySegment(Integer.parseInt(segkey[0]),Integer.parseInt(segkey[1]),Integer.parseInt(segkey[2]),Integer.parseInt(segkey[3]),Boolean.parseBoolean(segkey[4]),Integer.parseInt(segkey[5]),Byte.parseByte(segkey[6]));
if(segACK.Check==Integer.parseInt(segkey[7]))
{
if(segACK.ACK)
{
acked=segACK.AcknowledgementNumber>acked?segACK.AcknowledgementNumber:acked;
window=segACK.Window;
System.out.println("received ACK of "+segACK.AcknowledgementNumber);
}
}
}
}
toSend.setText("toSend: "+content.substring(acked+1).toString());
if(acked==49)
{
toSend.setText("All data sent to Client successfully!");
Thread.sleep(3000);
break;
}
}
socket.close();
server.close();
}
}