Bueno, independientemente de la eficacia del componente a utilizar (que al fin y a cabo solo "obedecerá" a la "configuración" del programador), hago énfasis en que el código que utiliza "n00b"

que envía caracter por caracter el archivo

.
Eso es una practica muy mala, y como yo lo veo es aún mucho peor considerando su algoritmo de recepción de datos, intento explicar el problema;
Button1Click abre el archivo y byte por byte envía su contenido al componente ClientSocket1 el cual envía
al socket dicho byte, por su parte el SO utilizando el
Nagle algorithm va almacenando estos bytes hasta que el tamaño de envío sea el adecuado, cuando esto ocurre el paquete es enviado (Hablamos de un
paquete no del archivo entero).
En el otro extremo de la conexión ServerSocket1ClientRead recive los datos enviados (no es un caracter ni todo el archivo sino un paquete de dimensión X), y crea/sobrescribe el 'archivo.txt' guardando el paquete. Considérese que cada vez que recibe un dato el archivo es pisado!
Para corregir dicho código se puede utilizar un valor X de dimensión mayor a un byte para saber que el archivo debe ser creado, luego enviar los datos sin utilizar el Nagle algorithm (esto
configurando el valor TCP_NODELAY del socket), en el otro extremo al recibir un valor mayor a un byte crear el archivo, caso contrario realizar un
Append.
Este método es muy lento he ineficaz, lo correcto sería enviar el
tamaño del archivo primero, luego el
contenido del archivo en bloques de tamaño razonable (~4 Kb).
Saludos